如何从<dt>标签中获取带有<span>的文本?</span> </dt>

时间:2013-12-22 02:54:52

标签: python web-scraping beautifulsoup

我正在尝试从www.uszip.com上的<dt>标记内部<span>内提取文字:

以下是我想要获得的一个例子:

<dt>Land area<br><span class="stype">(sq. miles)</span></dt>
<dd>14.28</dd>

我想从标记中获取14.28。这就是我目前正在接近它的方式:

注意:汤是整个网页源代码的BeautifulSoup版本:

soup.find("dt",text="Land area").contents[0]

但是,这给了我一个

AttributeError: 'NoneType' object has no attribute 'contents'

我尝试了很多东西,但我不确定如何处理这个问题。此方法适用于此页面上的某些其他数据,例如:

<dt>Total population</dt>
<dd>22,234<span class="trend trend-down" title="-15,025 (-69.77% since 2000)">&#9660;</span></dd>

使用soup.find("dt",text="Total population").next_sibling.contents[0]会返回'22,234'

我应该如何首先确定正确的标签,然后从中获取正确的数据?

1 个答案:

答案 0 :(得分:4)

不幸的是,根据单独包含的文本,您无法将标记与文本和嵌套标记匹配。

您必须在没有文字的情况下遍历所有<dt>

for dt in soup.find_all('dt', text=False):
    if 'Land area' in dt.text:
        print dt.contents[0]

这听起来违反直觉,但此类标记的.string属性为空,这就是BeautifulSoup所匹配的内容。 .text包含所有嵌套标记中的所有字符串,并且不匹配。

您还可以使用custom function进行搜索:

soup.find_all(lambda t: t.name == 'dt' and 'Land area' in t.text)

基本上使用封装在lambda函数中的过滤器进行相同的搜索。