Красивый суп не разбирает полные сайты HTML код - PullRequest
0 голосов
/ 30 сентября 2019

Это часть кода, над которой я работаю для очистки данных сайта.

page = 'https://www.pro-football-reference.com/boxscores/200409090nwe.htm'
sub_data = requests.get(page).text
sub_soup = bs4.BeautifulSoup(sub_data, "html.parser")

for toss in sub_soup.findAll('table', {'class':'suppress_all sortable stats_table now_sortable'}):
print(toss)

Даже если эта строка кода неверна, я попытался использовать более общий код, чтобы попытаться найти данные, которые я ''я ищу как

for toss in sub_soup.findAll('td', {'class':'center'}):
print(toss)

Я пытаюсь вытащить строку текста (который выиграл жеребьевку - "Победа жеребьевки") из таблицы "Информация об игре" - в этом случае ответ должен быть "Патриоты"«. По какой-то причине весь раздел HTML для таблицы с информацией об игре отсутствует в sub_soup. Я также пытался использовать разные парсеры, например html5lib. Существует раздел, который заключен в кавычки в sub_soup (и вы можете увидеть это, просмотрев строки с сайта), но не в формате HTML. Фактический HTML-код, увиденный на сайте, отсутствует в этом разделе, среди прочего. Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 01 октября 2019

Я люблю работать со спортивными данными. У меня была эта проблема с профессиональными ссылочными сайтами раньше. Таблицы отображаются после, поэтому в большинстве случаев вам нужно будет использовать Selenium, чтобы разрешить его визуализацию, или, как упоминалось выше, а затем можно получить источник HTML. Но в этом нет необходимости, так как большинство таблиц находятся в комментариях к исходному HTML-ответу. Вы можете использовать BeautifulSoup для извлечения комментариев, а затем выполнять поиск по тегам <table>.

Я также предпочитаю использовать панд каждый раз, когда вижу или мне нужно вытянуть теги <table>. Панды используют Beautifulsoup под капотом и выполняют большую часть работы. Все, что вам нужно сделать, это манипулировать столом, если это необходимо.

Это создаст список таблиц, достаточно просто вытянуть нужную, которая находится в позиции индекса 1:

Код:

import requests
from bs4 import BeautifulSoup
from bs4 import Comment
import pandas as pd


url = 'https://www.pro-football-reference.com/boxscores/200409090nwe.htm'
response = requests.get(url)

soup = BeautifulSoup(response.text, 'html.parser')
comments = soup.find_all(string=lambda text: isinstance(text, Comment))

tables = []
for each in comments:
    if 'table' in each:
        try:
            tables.append(pd.read_html(each)[0])
        except:
            continue

Вывод:

print (tables[1])
            0                                                  1
0   Game Info                                          Game Info
1    Won Toss                                           Patriots
2        Roof                                           outdoors
3     Surface                                              grass
4     Weather  73 degrees, relative humidity 99%, wind 19 mph...
5  Vegas Line                          New England Patriots -3.0
6  Over/Under                                        44.5 (over)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...