您的位置:首页
Beautiful Soup 解决爬虫编码格式问题,Beautiful Soup编码格式
2018-01-04 17:53
399 查看
一。 为什么要用解析框架 bs4
我觉得爬虫最难得问题就是编码格式,因为你不知道要爬取目标网站的编码格式,有可能是Unicode,utf-8, ASCII , gbk格式,但是使用Beautiful Soup解析后,文档都被转换成了Unicode,通过Beautiful Soup输出文档时,不管输入文档是什么编码方式,输出编码均为UTF-8编码, 因为 Beautiful Soup用了 编码自动检测 子库来识别当前文档编码并转换成Unicode编码。
编码自动检测 功能大部分时候都能猜对编码格式,但有时候也会出错.有时候即使猜测正确,也是在逐个字节的遍历整个文档后才猜对的,这样很慢.如果预先知道文档编码,可以设置编码参数来减少自动检查编码出错的概率并且提高文档解析速度.在创建 BeautifulSoup 对象的时候设置 from_encoding 参数
下面一段文档用了ISO-8859-8编码方式,这段文档太短,结果Beautiful Soup以为文档是用ISO-8859-7编码:
通过传入 from_encoding 参数来指定编码方式:
下面例子输入文档是Latin-1编码:
如果不想用UTF-8编码输出,可以将编码方式传入 prettify() 方法:
还可以调用 BeautifulSoup 对象或任意节点的 encode() 方法,就像Python的字符串调用 encode() 方法一样:
我觉得爬虫最难得问题就是编码格式,因为你不知道要爬取目标网站的编码格式,有可能是Unicode,utf-8, ASCII , gbk格式,但是使用Beautiful Soup解析后,文档都被转换成了Unicode,通过Beautiful Soup输出文档时,不管输入文档是什么编码方式,输出编码均为UTF-8编码, 因为 Beautiful Soup用了 编码自动检测 子库来识别当前文档编码并转换成Unicode编码。
编码自动检测 功能大部分时候都能猜对编码格式,但有时候也会出错.有时候即使猜测正确,也是在逐个字节的遍历整个文档后才猜对的,这样很慢.如果预先知道文档编码,可以设置编码参数来减少自动检查编码出错的概率并且提高文档解析速度.在创建 BeautifulSoup 对象的时候设置 from_encoding 参数
下面一段文档用了ISO-8859-8编码方式,这段文档太短,结果Beautiful Soup以为文档是用ISO-8859-7编码:
markup = b"<h1>\xed\xe5\xec\xf9</h1>" soup = BeautifulSoup(markup) soup.h1 <h1>νεμω</h1> soup.original_encoding 'ISO-8859-7'
通过传入 from_encoding 参数来指定编码方式:
soup = BeautifulSoup(markup, from_encoding="iso-8859-8") soup.h1 <h1>םולש</h1> soup.original_encoding 'iso8859-8'
下面例子输入文档是Latin-1编码:
markup = b''' <html> <head> <meta content="text/html; charset=ISO-Latin-1" http-equiv="Content-type" /> </head> <body> <p>Sacr\xe9 bleu!</p> </body> </html> ''' soup = BeautifulSoup(markup) print(soup.prettify()) # <html> # <head> # <meta content="text/html; charset=utf-8" http-equiv="Content-type" /> # </head> # <body> # <p> # Sacré bleu! # </p> # </body> # </html>
如果不想用UTF-8编码输出,可以将编码方式传入 prettify() 方法:
print(soup.prettify("latin-1")) # <html> # <head> # <meta content="text/html; charset=latin-1" http-equiv="Content-type" /> # ...
还可以调用 BeautifulSoup 对象或任意节点的 encode() 方法,就像Python的字符串调用 encode() 方法一样:
soup.p.encode("latin-1") # '<p>Sacr\xe9 bleu!</p>' soup.p.encode("utf-8") # '<p>Sacr\xc3\xa9 bleu!</p>'
相关文章推荐
- [置顶] FFmpeg学习—解决ffmpeg 进行Audio 编码 采用AV_SAMPLE_FMT_S16 格式报 Input contains NaN/+-Inf 错误的问题
- tomcat编码格式的设置/如何解决get()方式提交中文参数乱码的问题
- 【转】python基础===codecs打开文件,解决文件编码格式的问题
- 【爬虫】python解决QQ邮箱查询接口的中文编码问题
- Python 爬虫编码格式问题 gb2312转换utf8
- JavaWeb中使用Filter以及装饰者设计模式解决全局编码格式问题
- 解决表单乱码问题之一,修改tomcat默认编码格式
- 服务器数据库编码格式问题解决方案
- python基础===codecs打开文件,解决文件编码格式的问题
- 查看mysql数据库及表编码格式和解决中文乱码问题
- JSP中编码格式问题的解决
- 修改SecureCRT的客户端显示的编码格式(解决显示乱码问题)
- 不修改数据库编码格式的前提下解决emoji表情存储乱码问题
- delphi 如何判断编码格式,解决乱码问题
- 项目以及ide的编码格式都改为utf-8后,页面依旧乱码问题的解决方法
- eclipse下更改jsp页面默认的编码格式,解决中文乱码问题
- MySQL报:ERROR 1366 (HY000) 编码格式错误 解决问题的办法
- 配置mysql默认编码格式 && 解决Can't connect to local MySQL server through socket 问题
- mysql--Linux下解决编码格式问题(5.5.*)
- servlet中编码格式及设置乱码问题解决