我正在尝试解析一些我刮下来的HTML,遇到了一个奇怪的问题。我需要找到一个<td>
标记,它包含一个具有特定名称的<a>
标记,然后我想转储整个<td>
标记的内容。现在我只想让它打印<a>
标记的“name”属性的内容。我的理解是,如果我有一个特定的元素(而不是元素列表),那么该元素的“attrs”应该是一个字典,我应该能够通过字符串键提取值:
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
如果我修改代码只打印锁定.attrs,这显然是一个列表,而不是一本字典:
[(u'name', u'EMAIL')]
我在stackoverflow上看到一些东西,表明如果您尝试解析findAll
的属性,您将得到一个列表,但是我将逐个元素进行分析,所以不清楚为什么会出现这种情况。你知道吗
我也尝试过修改一些东西,以便它使用find()
只获取项目的第一个,但“attrs”仍然是一个列表。你知道吗
通过整数获取所需的数据是可行的,但我不能依赖于所需的数据总是在列表中的同一位置。我知道我可以使用findAll
按实际属性搜索特定的元素,但是我只需要匹配name属性中字符串的前几个单词,所以我认为这行不通。你知道吗
编辑:下面是我试图通过汤.美化():
<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赔率”开头的“name”字段,如果有,则返回整个<td>
块进行额外的解析。你知道吗
进一步编辑: 我使用的是python2.7.12和非bs4beautifulsou,以防相关。你知道吗
jwodder是对的;版本4之前的BeautifulSoup版本似乎返回属性列表。我升级到bs4,现在可以用了。谢谢大家!你知道吗
相关问题 更多 >
编程相关推荐