Я пытаюсь разобрать какой-то 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, на случай, если это уместно.