最近幫助公司其他團隊用python寫了一個爬蟲,遇到了不少問題,其中就有一個問題是使用BeautifulSoup4的find_all
搜尋包含指定文字內容時返回的是空的list,檢視了官方文件也上google搜尋了一些類似的問題,發現是因為在使用bs4的find_all
結合正規表示式查詢指定文字的時候,搜尋的是bs4返回元素中string屬性
中的資訊,而不是text屬性
。並且如果某個元素中如果還包含除了文字之外的子元素,string屬性
返回會是None,而不是像text屬性
中那樣的文字資訊。
如果HTML中的內容結構像下面這樣:
<td>some text</td>
<td></td>
<td><p>more text</p></td>
<td>even <p>more text</p></td>
複製程式碼
td 上的.string屬性將會返回下面的內容: 1、some text 2、None 3、more text 4、None
.text 屬性將會返回下面的內容: 1、some text 2、 3、more text 4、even more text
如果想要了解.find
和.string
之間的差異可以檢視Python BeautifulSoup 中.text與.string的區別
解決辦法是使用lambda函式
>>> soup.find_all(lambda e: e.name == 'td' and 'Black' in e.text)
[<td id="rp10" valign="top">Black or African American alone, percent, 2013 (a) <!-- RHI225213 --> </td>, <td id="re6" valign="top">Black-owned firms, percent, 2007 <!-- SBO315207 --> </td>]
複製程式碼