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">溫潤如玉</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