Python 如何从a<;中获取文本;dt>;标记为<;span>;在…内

Python 如何从a<;中获取文本;dt>;标记为<;span>;在…内,python,web-scraping,beautifulsoup,Python,Web Scraping,Beautifulsoup,我正试图从www.uszip.com上的标签中提取文本,标签内有: 下面是我想要得到的一个例子: <dt>Land area<br><span class="stype">(sq. miles)</span></dt> <dd>14.28</dd> 然而,这给了我一个机会 AttributeError: 'NoneType' object has no attribute 'contents' 我已经尝试了很

我正试图从www.uszip.com上的
标签中提取文本,标签内有

下面是我想要得到的一个例子:

<dt>Land area<br><span class="stype">(sq. miles)</span></dt>
<dd>14.28</dd>
然而,这给了我一个机会

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>
总人口
22,234▼
使用
soup.find(“dt”,text=“Total population”).next_sibling.contents[0]
返回
'22234'


如何首先识别正确的标记,然后从中获取正确的数据?

不幸的是,仅基于包含的文本,无法将标记与文本和嵌套标记进行匹配

您必须在所有
上循环,无需文本:

这听起来有悖常理,但此类标记的
.string
属性为空,这正是BeautifulSoup所要匹配的
.text
包含组合的所有嵌套标记中的所有字符串,并且这些字符串不匹配

您也可以使用进行搜索:

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

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

不幸的是,仅基于包含的文本,无法将标记与文本和嵌套标记进行匹配

您必须在所有
上循环,无需文本:

这听起来有悖常理,但此类标记的
.string
属性为空,这正是BeautifulSoup所要匹配的
.text
包含组合的所有嵌套标记中的所有字符串,并且这些字符串不匹配

您也可以使用进行搜索:

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

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

Hmm,我尝试过,但它再次给了我相同的错误消息。我不知道它是否找到了正确的标记。然后,您正在查看一个没有
标记的页面,其中直接包含字符串
土地面积
。你有链接吗?例如:www.uszip.com/zip/48167我用它来获取soup:`url=urllib2.urlopen(url)content=url.read()soup=beautifulsou(content)`没有,确实,我看到了你想要的标记,但匹配的文本没有找到它。可能是因为还有其他嵌套标记。你必须循环,我会更新。你也可以尝试匹配“陆地面积(平方英里)”,如果你打印dt标签的文本,这就是你得到的,可能就是“陆地面积”不起作用的原因。嗯,我试过了,但它再次给我相同的错误消息。我不知道它是否找到了正确的标记。然后,您正在查看一个没有
标记的页面,其中直接包含字符串
土地面积
。你有链接吗?例如:www.uszip.com/zip/48167我用它来获取soup:`url=urllib2.urlopen(url)content=url.read()soup=beautifulsou(content)`没有,确实,我看到了你想要的标记,但匹配的文本没有找到它。可能是因为还有其他嵌套标记。你必须循环,我会更新。如果你打印dt标签的文本,你也可以尝试匹配“陆地面积(平方英里)”,这可能就是为什么“陆地面积”不起作用的原因。
soup.find_all(lambda t: t.name == 'dt' and 'Land area' in t.text)