BeautifulSoup解析非標準HTML的問題

發現問題:

BeautifulSoup版本:4.3.2html

在用BeautifulSoup.find_all()搜索HTML時,遇到下面的代碼:api

<a href="/shipin/donghuapian/2012-07-25/23404.html"title="謙謙君子" target="_blank">溫潤如玉</a> 

能夠看出代碼中a標籤的href屬性和title屬性之間沒有空格。

工具

分析問題:

經過BeautifulSoup的診斷工具(4.2版以上纔有)diagnose:spa

from bs4.diagnose import diagnose
html_doc = open('test.html').read()
diagnose(html_doc)

 

發現那行代碼被解析成:code

<a href="/shipin/donghuapian/2012-07-25/23404.html"> title="謙謙君子" target="_blank"&gt;溫潤如玉</a>


看出來了嗎?這是個錯誤的a標籤,包含title和target位置出現錯誤,形成BeautifulSoup.find_all()解析到此行代碼時,匹配title就會失敗。

問題出現的緣由是BeautifulSoup默認使用Python自帶的html parser,對錯誤網頁的兼容性不強。xml

解決辦法:

爲BeautifulSoup指定一個新的html parser,這裏有詳情,我選擇了lxml:
htm

sudo pip install lxml

建立BeautifulSoup對象時,添加一個參數:對象

#coding=utf-8
import re
from bs4 import BeautifulSoup

html_doc = open('test.html').read() soup = BeautifulSoup(html_doc, 'lxml')  # 選擇lxml做爲新的html parser。 tags = soup.find_all('a', {'title': re.compile(u'君子')})


就OK了。blog

相關文章
相關標籤/搜索