鱼C论坛

 找回密码
 立即注册
查看: 1365|回复: 6

[已解决]求教大佬们一个关于bs4和编码的问题

[复制链接]
发表于 2018-2-8 22:59:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 天圆突破 于 2018-2-8 23:09 编辑
  1.     #爬第 1 页信息范例
  2.     req = q.get('https://www.din.de/en/meta/search/61764!search?query=' + keywords)
  3.     if req.status_code == q.codes.ok:
  4.         req.encoding = req.content
  5.         data = req.text
  6.         soup = BeautifulSoup(data,"html.parser")

  7.         #抓取总条数
  8.         total = str(soup.find_all('span', class_= "panel-sub-heading")[0]).split('of ')[1].split(' ')[0]
  9.         print(total)

  10.         #抓取标题为列表
  11.         title = list()
  12.         title_tmp = soup.find_all('span', class_="panel-medium")
  13.         for each in title_tmp:
  14.             each = str(each).split('</span>')[0].split('\t'*7)[1]
  15.             title.append(each)
  16.         print(title)
  17.         print(len(title))

  18.         for each in title:
  19.             print(each)
复制代码


上面是写了一半的代码,发现有个很奇怪的问题。
最后抓标题为列表那里,当逐份打印列表里的每一项的时候(图一),显示正常,但是当打印列表的时候(图二),就出现编码问题了,具体问题见下图:

逐项正常.png
打印每一项的时候,空格 能正常显示

列表出错.png
打印列表的时候,一部分 空格 就出现编码问题了

我查资料,看有人说过在【soup = BeautifulSoup(data,"html.parser")】这句里面加上【encoding = 'utf-8'】,试过了仍然是这个问题。
请教大佬这是怎么回事啊?要怎么解决?

PS:哦对了,这个虽然是德国网站,但是内容是纯英文,不存在德文乱码的问题。
最佳答案
2018-2-9 00:50:52
这不是乱码。。。。。。。
\x0 是不间断空格。。。。。
print打印字符串是会把字符串转换成显示的方式(就比如换行就换一行),
但是打印列表以及其它类中__str__返回非str的类(此处详见魔术方法__str__/__repr__),都是不会转换输出的,输出实际内容
空格用可见形式表示,不间断空格无法直接表示出来,同理还有换行、tab、等一系列特殊字符(在不支持中文的机器上中文同样只会显示字符的16进制形式),
总结,print函数只在传入内容为字符串时做显示转换,当传入非字符串时显示实际内容
  1. # 测试代码
  2. print('********************************************')
  3. print('字符串a')
  4. a = 'Ascii\n== <<半角空格<<不间断空格\xa0>>全角空格>>\u3000==,\n换行\n\ttab制表符\n'
  5. print('a的bytes字节形式\n',bytes(a, encoding='utf8'))
  6. print('--------------------------------------------')
  7. print('a的打印形式\n',a)
  8. print('********************************************')

  9. print('********************************************')
  10. class b_object(object):
  11.     def __init__(self):
  12.         self.b1 = 'Ascii\n== <<半角空格<<不间断空格\xa0>>全角空格>>\u3000==,\n换行\n\ttab制表符\n'

  13. b = b_object()
  14. print('无__str__方法的类b')
  15. print('b的bytes字节形式\n',bytes(b.b1, encoding='utf8'))
  16. print('--------------------------------------------')
  17. print('b的打印形式\n',b)
  18. print('********************************************')

  19. print('********************************************')
  20. class c_object(object):
  21.     def __init__(self):
  22.         self.c1 = 'Ascii\n== <<半角空格<<不间断空格\xa0>>全角空格>>\u3000==,\n换行\n\ttab制表符\n'

  23.     def __str__(self):
  24.         return self.c1
  25. c = c_object()
  26. print('有__str__方法的类c')
  27. print('c的bytes字节形式\n',bytes(c.c1, encoding='utf8'))
  28. print('--------------------------------------------')
  29. print('c的打印形式\n',c)
  30. print('********************************************')


复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-2-8 23:18:47 | 显示全部楼层
有可能是‘gbk’格式的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-8 23:21:27 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-2-8 23:18
有可能是‘gbk’格式的。

大佬,这是德国网站……gbk是中国标准……
好吧,我试过了,也无效。
还有,我想用each = ' '.join(each.split('/xa0'))分割字符串的方法,发现根本也去不掉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-8 23:30:34 | 显示全部楼层
更新,encoding编码改成'ISO-8859-1'仍然会出问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-9 00:50:52 | 显示全部楼层    本楼为最佳答案   
这不是乱码。。。。。。。
\x0 是不间断空格。。。。。
print打印字符串是会把字符串转换成显示的方式(就比如换行就换一行),
但是打印列表以及其它类中__str__返回非str的类(此处详见魔术方法__str__/__repr__),都是不会转换输出的,输出实际内容
空格用可见形式表示,不间断空格无法直接表示出来,同理还有换行、tab、等一系列特殊字符(在不支持中文的机器上中文同样只会显示字符的16进制形式),
总结,print函数只在传入内容为字符串时做显示转换,当传入非字符串时显示实际内容
  1. # 测试代码
  2. print('********************************************')
  3. print('字符串a')
  4. a = 'Ascii\n== <<半角空格<<不间断空格\xa0>>全角空格>>\u3000==,\n换行\n\ttab制表符\n'
  5. print('a的bytes字节形式\n',bytes(a, encoding='utf8'))
  6. print('--------------------------------------------')
  7. print('a的打印形式\n',a)
  8. print('********************************************')

  9. print('********************************************')
  10. class b_object(object):
  11.     def __init__(self):
  12.         self.b1 = 'Ascii\n== <<半角空格<<不间断空格\xa0>>全角空格>>\u3000==,\n换行\n\ttab制表符\n'

  13. b = b_object()
  14. print('无__str__方法的类b')
  15. print('b的bytes字节形式\n',bytes(b.b1, encoding='utf8'))
  16. print('--------------------------------------------')
  17. print('b的打印形式\n',b)
  18. print('********************************************')

  19. print('********************************************')
  20. class c_object(object):
  21.     def __init__(self):
  22.         self.c1 = 'Ascii\n== <<半角空格<<不间断空格\xa0>>全角空格>>\u3000==,\n换行\n\ttab制表符\n'

  23.     def __str__(self):
  24.         return self.c1
  25. c = c_object()
  26. print('有__str__方法的类c')
  27. print('c的bytes字节形式\n',bytes(c.c1, encoding='utf8'))
  28. print('--------------------------------------------')
  29. print('c的打印形式\n',c)
  30. print('********************************************')


复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-9 08:27:34 | 显示全部楼层
lies_for_L 发表于 2018-2-9 00:50
这不是乱码。。。。。。。
\x0 是不间断空格。。。。。
print打印字符串是会把字符串转换成显示的方式( ...


那大佬请问这个是不是就不用去管了?写入文件的话不影响吧(比如写入txt或者excel)?
一般经验上来说,做数据处理的话,写入数据库前要不要对这种字符做处理?(比如说对会不会影响sql查询)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-9 09:33:54 | 显示全部楼层
天圆突破 发表于 2018-2-9 08:27
那大佬请问这个是不是就不用去管了?写入文件的话不影响吧(比如写入txt或者excel)?
一般经验上来说 ...

不影响啊,文件最好用utf8不然可能打开会乱码,
这和直接网页复制粘贴到word时没有回车只有换行一样的,
可以的话可以正则替换成空格

  1. re_pattern = '\\s+'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-7 14:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表