精进Beautiful Soup 小技巧(一)

前言:

对Beautiful Soup已经用了有快3年了,对于一些html等的使用也有一些特殊方法;来一些平时不容易察觉的,但其实很有用的大小!

使用合适的解析器:

实例化BeautifulSoup时,选择合适的解析器,如 html.parser, lxml, 或 html5lib,以取得性能与兼容性的最佳平衡。对速度的需求,lxml 通常是首选!

留意HTML的质量

当你处理的HTML文档格式良好时(例如,由现代CMS生成),html.parser 或 lxml 等解析器均可正常工作。而如果HTML文档结构不够完善,html5lib 就成为更合适的选择,因为它被设计为能够高容错解析有问题的标记,类似如何现代浏览器工作。


性能与正确性

做出合适选择时,你需要在速度(lxml)与HTML5规范兼容(html5lib)之间做出权衡。lxml 的速度令人印象深刻,但是如果HTML包含了更贴近最新HTML5标准的内容,html.parser 和尤其是html5lib在解析上可能更为准确。

案例

from bs4 import BeautifulSoup

bad_html = """

    Test Page
    
    

Test paragraph.

Incorrectly nested

Open Tag without close A Link """

我们将尝试三种不同的解析器:

使用 html.parser:
soup = BeautifulSoup(bad_html, "html.parser")
links = [a['href'] for a in soup.find_all('a')]
print("html.parser:", links)

使用 lxml:
soup = BeautifulSoup(bad_html, "lxml")
links = [a['href'] for a in soup.find_all('a')]
print("lxml:", links)

使用 html5lib:
soup = BeautifulSoup(bad_html, "html5lib")
links = [a['href'] for a in soup.find_all('a')]
print("html5lib:", links)

html.parser 可能错过有问题的标签内部的链接,因为它尝试用一种相对保守的方法去“修复”HTML。
lxml 可以给出较好的性能表现,但它在处理不完好的HTML标签时可能忽略结构层次,潜在地错过层次不清的链接。
html5lib,尽管速度不是它的优点,它能最好地恢复 HTML5 标准内允许的坏掉的HTML结构并提取到所有的链接。

你可能感兴趣的:(python,beautifulsoup)