Что не так с моим кодом Find_all моего красивого супа здесь? - PullRequest
0 голосов
/ 16 января 2020

Я чувствую, что упускаю что-то действительно базовое c, но я застрял. Я пытаюсь просто вернуть одну таблицу с Beautiful Soup, но по какой-то причине она не захватывает таблицу со счетом строк по ID. Я могу нацеливать другие div и таблицы по их идентификатору на этой странице, но по какой-то причине этот ничего не возвращает. Есть идеи, что мне не хватает?

from urllib.request import urlopen
from bs4 import BeautifulSoup
import ssl

url = 'https://www.sports-reference.com/cbb/boxscores/2020-01-14-19-clemson.html'
html = urlopen(url)
soup = BeautifulSoup(html.read(), 'html.parser')
ls = soup.find_all('table', {"id": "line-score"})

Скриншот веб-инспектора

Ответы [ 4 ]

0 голосов
/ 16 января 2020

Вы также можете получить таблицу путем рендеринга. В следующем коде используется библиотека pyppeter.

from simplified_html.request_render import RequestRender
req = RequestRender({ 'executablePath': '/Applications/chrome.app/Contents/MacOS/Google Chrome'})
def callback(html,url,data):
  from simplified_scrapy.simplified_doc import SimplifiedDoc 
  doc = SimplifiedDoc(html)
  table = doc.getElementByID('line-score')
  trs = table.trs.notContains('thead',attr='class').notContains('colspan') # Filter out the head
  for tr in trs:
    tds = tr.children
    print ([td.text for td in tds])
req.get('https://www.sports-reference.com/cbb/boxscores/2020-01-14-19-clemson.html',callback)

Результат:

['Duke', '33', '39', '72']
['Clemson', '40', '39', '79']
0 голосов
/ 16 января 2020

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

Чтобы получить из него данные, я предлагаю вам переключиться с BeautifulSoup на requests-html (очень похожая библиотека). Он обрабатывает эти Javascript случаи, а также обрабатывает веб-запрос.

Сначала вам нужно будет установить его: pip install requests-html.

Затем вы просто делаете это:

from requests_html import HTMLSession

session = HTMLSession()
request = session.get('https://www.sports-reference.com/cbb/boxscores/2020-01-14-19-clemson.html')
request.html.render() # Here is where you render the table

table = request.html.xpath('//table[@id="line-score"]')

Я предлагаю вам использовать xpath при поиске ваших элементов. Это гораздо лучший способ добраться до элементов, которые вы ищете. Если вы не понимаете xpaths, вот учебник Xpath от W3Schools .

С документацией requests-html можно ознакомиться здесь .

0 голосов
/ 16 января 2020

Да, таблица добавляется через JS, но данные уже есть в исходном коде. Вы можете получить его следующим образом:

from simplified_scrapy.request import req 
from simplified_scrapy.simplified_doc import SimplifiedDoc
html = req.get('https://www.sports-reference.com/cbb/boxscores/2020-01-14-19-clemson.html')
doc = SimplifiedDoc(html)
table = doc.getElement('table',attr='id',value='line-score')
trs = table.trs.notContains('thead',attr='class').notContains('colspan') # Filter out the head
for tr in trs:
  tds = tr.children
  print ([td.text for td in tds])

table = doc.getElement('table',attr='id',value='four-factors')
trs = table.trs.notContains('thead',attr='class').notContains('colspan') # Filter out the head
for tr in trs:
  tds = tr.children
  print ([td.text for td in tds])

Результат:

['Duke', '33', '39', '72']
['Clemson', '40', '39', '79']
['Duke', '73.5', '.574', '19.3', '13.8', '.185', '98.6']
['Clemson', '73.5', '.642', '19.3', '20.7', '.208', '108.2']

Примеры SimplifiedDo c можно найти здесь

0 голосов
/ 16 января 2020

Эта таблица, кажется, добавляется javascript, если вы действительно просматриваете источник (щелкните источник просмотра правой кнопкой мыши вместо просмотра), вы увидите, что таблица закомментирована в html.
Вам потребуется визуализировать фактическую страницу в браузере и получить сгенерированный источник.

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