【问题标题】:BeautifulSoup attrs returning list instead of dictionaryBeautifulSoup attrs 返回列表而不是字典
【发布时间】: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>

我正在寻找的是能够检查并查看第一个 &lt;a&gt; 标记是否具有以“关闭 NFL 赔率”开头的“名称”字段,如果是,则返回整个 &lt;td&gt;用于额外解析的块。

进一步编辑: 我正在使用 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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 2019-08-26
    • 1970-01-01
    • 2022-01-13
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多