beautifulsou attrs返回列表而不是字典

2024-09-29 23:28:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试解析一些我刮下来的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,以防相关。你知道吗


Tags: namein标记br元素列表属性attrs

热门问题