BeautifulSoup4 find_all搜索包含指定文本内
2018-08-30 本文已影响0人
吃素的外星人
最近帮助公司其他团队用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>]