BeautifulSoup attrs返回列表而不是字典

时间:2018-11-05 20:37:36

标签: python beautifulsoup

我正在尝试解析一些我抓取的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。

1 个答案:

答案 0 :(得分:1)

jwodder说得对;版本4之前的BeautifulSoup版本似乎返回属性的列表。我升级到bs4,现在可以使用了。谢谢大家!