BeautifulSoup4 не может найти таблицу, что бы я ни пытался - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь очистить 2 таблицы с веб-страницы одновременно.BeautifulSoup не находит первую таблицу без проблем, но, что бы я ни пытался, она не может найти вторую таблицу, вот веб-страница: Справка по хоккею: Джастин Абделькадер .

Это таблица под заголовком Playoffs.

Вот мой код.

        sauce = urllib.request.urlopen('https://www.hockey-reference.com/players/a/abdelju01/gamelog/2014', timeout=None).read()
        soup = bs.BeautifulSoup(sauce, 'html5lib')
        table = soup.find_all('table')
        print(len(table))

, который всегда печатает 1.

Если я печатаю (супа) и с помощью функции поиска в моем терминале я могу найти 2 отдельных табличных тега.Я не вижу javascript, который мешал бы BS4 найти тег.Я также попытался найти таблицу по идентификатору и классу, даже родительский div таблицы, кажется, невозможно найти.Кто-нибудь знает, что я могу делать не так?

Ответы [ 4 ]

0 голосов
/ 27 января 2019

Вы можете перейти к строке комментария с помощью комментария bs4:

from bs4 import BeautifulSoup , Comment
from urllib import urlopen


search_url = 'https://www.hockey-reference.com/players/a/abdelju01/gamelog/2014'

page = urlopen(search_url)
soup = BeautifulSoup(page, "html.parser")

table = soup.findAll('table') ## html part with no comment
table_with_comment = soup.findAll(text=lambda text:isinstance(text, Comment))
[comment.extract() for comment in table_with_comment]
## print table_with_comment  print all comment line

start = '<table class'

for c in range(0,len(table_with_comment)):
    if start in table_with_comment[c]:
         print table_with_comment[c] ## print comment line has <table class 
0 голосов
/ 27 января 2019

Из-за загрузки javascript дополнительной информации

Сегодня reports_html может загружать с html-страницы также содержимое javascript.

pip install requests-html

from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://www.hockey-reference.com/players/a/abdelju01/gamelog/2014')
r.html.render()
res = r.html.find('table')
print(len(res))
4
0 голосов
/ 27 января 2019

Похоже, что эта таблица является виджетом - нажмите «Поделиться и еще» -> «Вставить эту таблицу», вы получите скрипт со ссылкой:

https://widgets.sports -reference.com / wg.fcgi? CSS = 1 & сайт = ч & URL =% 2Fplayers% 2fa% 2Fabdelju01% 2Fgamelog% 2F2014 и деления = div_gamelog_playoffs

Как мы можем разобрать это?

import requests
import bs4
url = 'https://widgets.sports-reference.com/wg.fcgi?css=1&site=hr&url=%2Fplayers%2Fa%2Fabdelju01%2Fgamelog%2F2014&div=div_gamelog_playoffs'
widget = requests.get(url).text
fixed = '\n'.join(s.lstrip("document.write('").rstrip("');") for s in widget.splitlines())

soup = bs4.BeautifulSoup(fixed)
soup.find('td', {'data-stat': "date_game"}).text # => '2014-04-18'

Voila!

0 голосов
/ 27 января 2019

Вторая таблица находится внутри тега комментария HTML <--... <table class=....Наверное, поэтому BeautifulSoup его не находит.

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