一。 为何要用解析框架 bs4html
我以为爬虫最可贵问题就是编码格式,由于你不知道要爬取目标网站的编码格式,有多是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编码:ui
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编码:spa
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() 方法:code
print(soup.prettify("latin-1")) # <html> # <head> # <meta content="text/html; charset=latin-1" http-equiv="Content-type" /> # ...
还能够调用 BeautifulSoup 对象或任意节点的 encode() 方法,就像Python的字符串调用 encode() 方法同样:htm
soup.p.encode("latin-1") # '<p>Sacr\xe9 bleu!</p>' soup.p.encode("utf-8") # '<p>Sacr\xc3\xa9 bleu!</p>'