BeautifulSoup4 find_all搜尋包含指定文字內容的標籤返回空list的問題

smallbone發表於2018-08-30

最近幫助公司其他團隊用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>]
複製程式碼

相關文章