2017-01-09 1 views
4

XPath Я пытаюсь получить данные из «Advanced Box Оценка статистики» из следующей веб-странице: http://www.sports-reference.com/cbb/boxscores/2016-11-11-villanova.htmlPython - Невозможно получить данные из веб-страниц таблицы с помощью Beautiful Soup или LXML

Я попытался с помощью BeautifulSoup в очень широкий способ получить все таблицы:

import requests 
from bs4 import BeautifulSoup 

base_url = "http://www.sports-reference.com/cbb/boxscores/2016-11-11-villanova.html" 
r = requests.get(base_url) 
soup = BeautifulSoup(r.text, "html.parser") 
tables = soup.find_all("table") 
for table in tables: 
     print table.get_text() 

При этом, он только извлек «Basic Box Score Статистика» Тем не менее, не извлекать «Advanced Box оценка статистики», как я надеялся

..

Далее, я попробовал ge ttt более конкретно, используя путь lxml:

import requests 
from lxml import html 
page = requests.get('http://www.sports-reference.com/cbb/boxscores/2016-11-11-villanova.html') 
tree = html.fromstring(page.content) 
boxscore_Advanced = tree.xpath('//*[@id="box-score-advanced-lafayette"]/tbody/tr[1]/td[1]/text()’) 
print boxscore_Advanced 

При этом он возвращает пустой список.

Я боролся с этим за хорошее количество времени, и попытались решить эту проблему, используя следующие сообщения:

Заранее благодарю за любую помощь!

+0

вы проверили, что таблица на самом деле в HTML, а не добавляются на страницу с помощью JavaScript позже? – snakecharmerb

+0

Я не верю, что сделал. Как я могу это сделать? (P.S. спасибо за быстрый ответ @snakecharmerb!) – nreit10

ответ

4

Нет необходимости использовать selenium и/или PhantomJS. Таблицы «Advanced Box Score Stats» на самом деле находятся внутри HTML, они находятся только внутри комментариев HTML. Разобрать их:

import requests 
from bs4 import BeautifulSoup, Comment 


url = "http://www.sports-reference.com/cbb/boxscores/2016-11-11-villanova.html" 
response = requests.get(url) 
soup = BeautifulSoup(response.content, "html.parser") 

# find the comments containing the desired tables 
tables = soup.find_all(text=lambda text: text and isinstance(text, Comment) and 'Advanced Box Score Stats' in text) 

# we have 2 tables - one for an opponent team 
for table in tables: 
    table_soup = BeautifulSoup(table, "html.parser") 
    advanced_table = table_soup.select_one("table[id^=box-score-advanced]") 
    for row in advanced_table("tr")[2:]: # skip headers 
     print(row.th.get_text()) 
    print("-------") 

Выводит имена игроков из первых столбцов расширенных таблиц:

Nick Lindner 
Monty Boykins 
Matt Klinewski 
Paulius Zalys 
Auston Evans 
Reserves 
Myles Cherry 
Kyle Stout 
Eric Stafford 
Lukas Jarrett 
Hunter Janacek 
Jimmy Panzini 
School Totals 
------- 
Kris Jenkins 
Phil Booth 
Josh Hart 
Jalen Brunson 
Darryl Reynolds 
Reserves 
Donte DiVincenzo 
Mikal Bridges 
Eric Paschall 
Tim Delaney 
Dylan Painter 
Denny Grace 
Tom Leibig 
Matt Kennedy 
School Totals 
------- 
+0

Мне очень нравится этот @alecxe! Я очень ценю, что вы нашли время, чтобы подробно изучить это, и поблагодарить вас за это понимание! – nreit10

2

@snakecharmerb находится по правильному пути: эта таблица не существует в необработанном html и должна быть добавлена ​​Javascript во время выполнения.

ли это:.

$ curl http://www.sports-reference.com/cbb/boxscores/2016-11-11-villanova.html | grep "box-score-advanced-lafayette" 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 9891 0 9891 0  0 45371  0 --:--:-- --:--:-- --:--:-- 48965<div id="all_box-score-advanced-lafayette" class="table_wrapper setup_commented commented"> 
    <span class="section_anchor" id="box-score-advanced-lafayette_link" data-label="Advanced Box Score"></span> 
     <div class="overthrow table_container" id="div_box-score-advanced-lafayette"> 
    <table class="sortable stats_table" id="box-score-advanced-lafayette" data-cols-to-freeze=1><caption>&nbsp; Table</caption> 
100 141k 0 141k 0  0 349k  0 --:--:-- --:--:-- --:--:-- 363k 

Вы видите из вывода, что все, что существует в HTML является контейнером, что таблица будет построена в

Для выскабливания что-то вроде этого, я рекомендую подход как Phantom.js http://phantomjs.org

+0

Спасибо за эту рекомендацию, Шейн! После борьбы с этим до тех пор, пока я это сделал, я не могу начать рассказывать вам, как я в восторге узнаю о Phantom.js – nreit10