我正在尝试解析一些我抓取的HTML,并遇到一个奇怪的问题。我需要找到一个包含带有特定名称的<td>
标记的<a>
标记,然后我要转储整个<td>
标记的内容。现在,我只是想让它实际打印<a>
标记的“ name”属性的内容。我的理解是,如果我有一个特定的元素(而不是元素列表),则该元素的“属性”应该是字典,并且我应该能够通过字符串键提取值:
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项目,但“属性”仍然是一个列表。
用整数来获取所需的内容,但是我不能依赖始终位于列表中同一位置的数据。我知道我可以使用findAll
通过实际属性搜索特定元素,但是我只需要匹配name属性中字符串的前几个单词,所以我认为这不起作用。 / p>
编辑:这是我正在尝试通过soup.prettify()解析的HTML代码的片段:
<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>
标签是否具有以“ Closing NFL Odds”开头的“ name”字段,如果存在,则返回整个{ {1}}块以进行其他解析。
进一步编辑: 如果相关,我正在使用Python 2.7.12和非bs4 BeautifulSoup。
答案 0 :(得分:1)
jwodder说得对;版本4之前的BeautifulSoup版本似乎返回属性的列表。我升级到bs4,现在可以使用了。谢谢大家!