BeautifulSoup attrs возвращает список вместо словаря - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь разобрать какой-то HTML-код, с которым я столкнулся, и столкнулся со странной проблемой. Мне нужно найти тег <td>, который содержит тег <a> с определенным именем, а затем я хочу сбросить содержимое всего тега <td>. Сейчас я просто пытаюсь заставить его фактически напечатать содержимое атрибута "name" тега <a>. Насколько я понимаю, если у меня есть определенный элемент (в отличие от списка элементов), «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 / Кроме того, потому что не все блоки <td> в HTML имеют блоки <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 для поиска определенных элементов по фактическому атрибуту, но мне нужно сопоставить только первые несколько слов строки в атрибуте имени, поэтому я не думаю, что это сработает.

РЕДАКТИРОВАТЬ: Вот фрагмент кода HTML, который я пытаюсь разобрать, с помощью soup.prettify ():

<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», и, если это так, вернуть целое <td> блок для дополнительного разбора.

Дальнейшее редактирование: Я использую Python 2.7.12 и не-bs4 BeautifulSoup, на случай, если это уместно.

1 Ответ

0 голосов
/ 06 ноября 2018

jwodder имел это право; Версии BeautifulSoup до версии 4, кажется, возвращают списки для атрибутов. Я обновился до bs4 и теперь он работает. Спасибо всем!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...