|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 天圆突破 于 2018-2-8 23:09 编辑
- #爬第 1 页信息范例
- req = q.get('https://www.din.de/en/meta/search/61764!search?query=' + keywords)
- if req.status_code == q.codes.ok:
- req.encoding = req.content
- data = req.text
- soup = BeautifulSoup(data,"html.parser")
- #抓取总条数
- total = str(soup.find_all('span', class_= "panel-sub-heading")[0]).split('of ')[1].split(' ')[0]
- print(total)
- #抓取标题为列表
- title = list()
- title_tmp = soup.find_all('span', class_="panel-medium")
- for each in title_tmp:
- each = str(each).split('</span>')[0].split('\t'*7)[1]
- title.append(each)
- print(title)
- print(len(title))
- for each in title:
- print(each)
复制代码
上面是写了一半的代码,发现有个很奇怪的问题。
最后抓标题为列表那里,当逐份打印列表里的每一项的时候(图一),显示正常,但是当打印列表的时候(图二),就出现编码问题了,具体问题见下图:
打印每一项的时候,空格 能正常显示
打印列表的时候,一部分 空格 就出现编码问题了
我查资料,看有人说过在【soup = BeautifulSoup(data,"html.parser")】这句里面加上【encoding = 'utf-8'】,试过了仍然是这个问题。
请教大佬这是怎么回事啊?要怎么解决?
PS:哦对了,这个虽然是德国网站,但是内容是纯英文,不存在德文乱码的问题。
这不是乱码。。。。。。。
\x0 是不间断空格。。。。。
print打印字符串是会把字符串转换成显示的方式(就比如换行就换一行),
但是打印列表以及其它类中__str__返回非str的类(此处详见魔术方法__str__/__repr__),都是不会转换输出的,输出实际内容
空格用可见形式表示,不间断空格无法直接表示出来,同理还有换行、tab、等一系列特殊字符(在不支持中文的机器上中文同样只会显示字符的16进制形式),
总结,print函数只在传入内容为字符串时做显示转换,当传入非字符串时显示实际内容
- # 测试代码
- print('********************************************')
- print('字符串a')
- a = 'Ascii\n== <<半角空格<<不间断空格\xa0>>全角空格>>\u3000==,\n换行\n\ttab制表符\n'
- print('a的bytes字节形式\n',bytes(a, encoding='utf8'))
- print('--------------------------------------------')
- print('a的打印形式\n',a)
- print('********************************************')
- print('********************************************')
- class b_object(object):
- def __init__(self):
- self.b1 = 'Ascii\n== <<半角空格<<不间断空格\xa0>>全角空格>>\u3000==,\n换行\n\ttab制表符\n'
- b = b_object()
- print('无__str__方法的类b')
- print('b的bytes字节形式\n',bytes(b.b1, encoding='utf8'))
- print('--------------------------------------------')
- print('b的打印形式\n',b)
- print('********************************************')
- print('********************************************')
- class c_object(object):
- def __init__(self):
- self.c1 = 'Ascii\n== <<半角空格<<不间断空格\xa0>>全角空格>>\u3000==,\n换行\n\ttab制表符\n'
- def __str__(self):
- return self.c1
- c = c_object()
- print('有__str__方法的类c')
- print('c的bytes字节形式\n',bytes(c.c1, encoding='utf8'))
- print('--------------------------------------------')
- print('c的打印形式\n',c)
- print('********************************************')
复制代码
|
|