Красивые данные, извлекаемые из супа - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь получить данные из таблицы Four Factors на этом сайте https://www.basketball -reference.com / boxscores / 201101100CHA.html .У меня проблемы с получением стола.Я попытался

url = https://www.basketball-reference.com/boxscores/201101100CHA.html
html = requests.get(url).content
soup = BeautifulSoup(html,"html.parser")

div = soup.find('div',id='all_four_factors')

Затем, когда я пытаюсь использовать tr = div.find_all('tr'), чтобы вытянуть строки, я ничего не получаю обратно.

Ответы [ 3 ]

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

Если вы посмотрите на list(div.children)[5], который является единственным дочерним элементом, в котором подстрока содержит tr, вы поймете, что это объект Comment, поэтому технически нет элемента tr вэтот div узел.Так что div.find_all('tr') ожидается пустым.

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

Я посмотрел на HTML-код, который вы пытаетесь очистить, и проблема в том, что все теги, которые вы пытаетесь получить, находятся в разделе комментариев, <!-- Like this --->.BeautifulSoup обрабатывает комментарии внутри как просто набор текста, а не фактический HTML-код.Итак, что вам нужно сделать, это взять содержимое комментария, а затем вставить эту строку обратно в BeautifulSoup:

import requests
from bs4 import BeautifulSoup, Comment

url = 'https://www.basketball-reference.com/boxscores/201101100CHA.html'
html = requests.get(url).content
soup = BeautifulSoup(html,"html.parser")

div = soup.find('div', id='all_four_factors')

# Get everything in here that's a comment
comments = div.find_all(text=lambda text:isinstance(text, Comment))

# Loop through each comment until you find the one that
# has the stuff you want.
for c in comments:

    # A perhaps crude but effective way of stopping at a comment
    # with HTML inside: see if the first character inside is '<'.
    if c.strip()[0] == '<':
        newsoup = BeautifulSoup(c.strip(), 'html.parser')
        tr = newsoup.find_all('tr')
        print(tr)

Одно предостережение с этим заключается в том, что BS будет предполагать, что закомментированный кодправильный, правильно сформированный HTML.Это работает для меня, хотя, если страница остается относительно той же, она должна продолжать работать.

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

Почему вы делаете:

div = soup.find('div',id='all_four_factors')

В результате вы получите следующую строку и попытаетесь найти в ней теги 'tr'.

<div id="all_four_factors" class="table_wrapper floated setup_commented commented">

Вы можете просто использовать исходную переменную супа из первой части и выполнить

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