【发布时间】:2018-11-06 09:53:53
【问题描述】:
我正在尝试解析一些我已经抓取并遇到奇怪问题的 HTML。我需要找到一个<td>标签,其中包含一个具有特定名称的<a>标签,然后我想转储整个<td>标签的内容。现在我只是想让它实际打印<a> 标签的“名称”属性的内容。我的理解是,如果我有一个特定元素(而不是元素列表),该元素的“属性”应该是一个字典,我应该能够通过字符串键提取值:
soup = BeautifulSoup(html)
for tdblock in soup.findAll('td'):
try:
for ablock in tdblock.findAll('a'):
print ablock.attrs['name']
except AttributeError:
pass
(try/except 块是因为并非所有 HTML 中的 <td> 块都有 <a> 块。)
但它会抛出一个TypeError:
Traceback (most recent call last):
File "fetch_historic_nfl_odds.py", line 26, in <module>
print ablock.attrs['name']
TypeError: list indices must be integers, not str
如果我修改代码只打印 ablock.attrs,它显然是一个列表,而不是字典:
[(u'name', u'EMAIL')]
我在 stackoverflow 上看到了一些内容,表明如果您尝试解析 findAll 的属性,您将获得一个列表,但我将逐个元素进行分析,因此不清楚为什么会这样.
我也尝试过修改一些东西,所以它使用find() 来获取第一个 A 项,但“attrs”仍然是一个列表。
通过整数获取我需要的数据是可行的,但我不能依赖我需要的数据始终位于列表中的同一位置。我知道我可以使用findAll 通过实际属性搜索特定元素,但我只需要匹配 name 属性中字符串的前几个单词,所以我认为这行不通。
编辑:这是我试图通过 soup.prettify() 解析的 HTML 代码的 sn-p:
<table width="644" border="0" cellpadding="3" cellspacing="0">
<tr>
<td>
<br />
<a name="Closing NFL Odds Week 1, 2006">
</a>
<center>
<font face="Georgia, Times New Roman, Times, serif">
<span style="font-size:14.0pt;font-family:Georgia">
<b>
Closing Las Vegas NFL Odds From Week 1, 2006
<br />
Week One NFL Football Odds
<br />
Pro Football Game Odds 9/7 - 9/11, 2006
</b>
</span>
</font>
</center>
我正在寻找的是能够检查并查看第一个 <a> 标记是否具有以“关闭 NFL 赔率”开头的“名称”字段,如果是,则返回整个 <td>用于额外解析的块。
进一步编辑: 我正在使用 Python 2.7.12 和非 bs4 BeautifulSoup,以防万一。
【问题讨论】:
-
您能否更新帖子以包含您尝试解析的有问题的
td元素之一的html? -
你的代码应该运行良好... ablock.attrs 怎么能输出一个元组列表??
-
我无法使用提供的 html sn-p 进行复制。它工作正常。
-
无法复制。在 Python 2.7.10 和 beautifulsoup4 4.4.0 和 Python 3.7.0 和 beautifulsoup4 4.6.3 下,
ablock.attrs对我来说是dict。 -
“非bs4 BeautifulSoup”是指您使用的是pre-version 4吗?为什么?那可能是你的问题。升级。
标签: python beautifulsoup