#python #beautifulsoup
#питон #прекрасный суп #python #beautifulsoup
Вопрос:
Я пытаюсь написать что-то, что извлекает спреды для результатов НФЛ. Следуя этому проекту, который использует ссылки на профессиональный футбол для всех игр, я пытаюсь сделать еще один шаг вперед. Пример страницы, которую я хочу очистить, выглядит следующим образом: https://www.pro-football-reference.com/boxscores/201709070nwe.htm .
Мой код до сих пор:
def get_spread(row):
a = row.findAll('a',href=True)
box_link = 'https://www.pro-football-reference.com/' a[-1]['href']
temp_soup = BeautifulSoup(urlopen(box_link),'html.parser')
table = temp_soup.find('div', {'id':'all_game_info'})
return table
Где строка определяется как soup.findAll('tbody', limit=1)[0].findAll('tr')[0:]
Игнорируя этот бит и пытаясь просто очистить эту страницу примера, если я использую table = temp_soup.find('div', {'id':'all_game_info'})
, я получаю, что table
это
<div class="table_wrapper setup_commented commented" id="all_game_info">
<div class="section_heading">
<span class="section_anchor" data-label="Game Info" id="game_info_link"></span><h2>Game Info</h2> <div class="section_heading_text">
<ul>
</ul>
</div>
</div>
<div class="placeholder"></div>
<!--
<div class="table_outer_container">
<div class="overthrow table_container" id="div_game_info">
<table class="suppress_all sortable stats_table" id="game_info" data-cols-to-freeze="0"><caption>Game Info Table</caption><tr class="thead onecell" ><td class="right center" data-stat="onecell" colspan="2" >Game Info</td></tr>
<tr ><th scope="row" class="center " data-stat="info" >Won Toss</th><td class="center " data-stat="stat" >Chiefs (deferred)</td></tr>
<tr ><th scope="row" class="center " data-stat="info" >Roof</th><td class="center " data-stat="stat" >outdoors</td></tr>
<tr ><th scope="row" class="center " data-stat="info" >Surface</th><td class="center " data-stat="stat" >fieldturf </td></tr>
<tr ><th scope="row" class="center " data-stat="info" >Duration</th><td class="center " data-stat="stat" >3:37</td></tr>
<tr ><th scope="row" class="center " data-stat="info" >Attendance</th><td class="center " data-stat="stat" ><a href="/years/2017/attendance.htm">65,878</a></td></tr>
<tr ><th scope="row" class="center " data-stat="info" >Weather</th><td class="center " data-stat="stat" >63 degrees, wind 8 mph</td></tr>
<tr ><th scope="row" class="center " data-stat="info" >Vegas Line</th><td class="center " data-stat="stat" >New England Patriots -8.0</td></tr>
<tr ><th scope="row" class="center " data-stat="info" >Over/Under</th><td class="center " data-stat="stat" >47.5 <b>(over)</b></td></tr>
</table>
</div>
</div>
-->
</div>
Мне нужны последние два (‘Vegas Line’ и ‘Over / Under’), однако, если я запускаю table.findall('tr')
, он возвращает None, так же, как если бы я пытался найти все для: ‘td’, ‘table’, ‘th’. Поэтому мне любопытно, как я могу извлечь эти значения из табличной переменной.
Ответ №1:
<table>
Находится внутри HTML comments ( <!-- ... -->
), поэтому для его извлечения необходимы дополнительные шаги:
import requests
from bs4 import BeautifulSoup, Comment
url = 'https://www.pro-football-reference.com/boxscores/201709070nwe.htm'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
table = soup.select_one('h2:contains("Game Info")').find_next(text=lambda t: isinstance(t, Comment))
# load <table> from HTML comments <!-- ... -->
soup = BeautifulSoup(str(table), 'html.parser')
vegas_line = soup.select_one('th:contains("Vegas Line")').find_next('td').text
over_under = soup.select_one('th:contains("Over/Under")').find_next('td').text
print(vegas_line)
print(over_under)
С принтами:
New England Patriots -8.0
47.5 (over)
Комментарии:
1. Ох. Не знал этого о HTML. Я предполагаю, что именно поэтому он также не отображается в soup.findall (‘table’)?
2. @yankeefan11 Да, именно по этой причине.
3. Это дает мне ‘NotImplementedError: реализованы только следующие псевдоклассы: n-го типа.’ с таблицей = строка?
4. @yankeefan11 Вы используете древнюю версию
beautifulsoup
. Я нахожусь на версииbeautifulsoup4==4.9.1
, пытаюсь обновить модуль.5. Спасибо. Google Colab не обновлен.