2016-12-16 2 views
0

Я пытаюсь очистить статистику за столом на этой странице: http://stats.nba.com/teams/traditional/, но я не могу найти html для таблицы. Это в python 2.7.10.Python and Beautiful Soup Web Scraping

from bs4 import BeautifulSoup 
import json 
import urllib 

html = urllib.urlopen('http://stats.nba.com/teams/traditional/').read() 

soup = BeautifulSoup(html, "html.parser") 


for table in soup.find_all('tr'): 
    print(table) 

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

+0

значений таблицы визуализируются с помощью JavaScript, так что вы будете нуждаться в парсер JavaScript для получения значений, в отличие от BeautifulSoup – smoggers

+0

У вас есть рекомендации для синтаксического анализа JavaScript? – johnbowman

+0

Вам действительно не нужно использовать парсер javascript, если вы знаете, откуда взялись данные, в этом случае это http://stats.nba.com/stats/leaguedashteamstats?Conference=&DateFrom=&DateTo=&Division=&GameScope=&GameSegment = & LastNGames = 0 & LeagueID = 00 & Расположение = & MeasureType = Base & Month = 0 & OpponentTeamID = 0 & Результат = & PORound = 0 & PaceAdjust = N & PerMode = PerGame & Period = 0 & PlayerExperience = & PlayerPosition = & PlusMinus = N & Rank = N & Сезон = 2016-17 & SeasonSegment = & SeasonType = Regular + Season & ShotClockRange = & StarterBench = & TeamID = 0 & VsConference = & VsDivision = – Shane

ответ

0

Таблица загружается динамически, поэтому, когда вы захватываете html, в ней нет tr тегов.

0

Таблица, которую вы ищете, НЕ находится на этой конкретной странице/URL.

, который вы пытаетесь скрести прийти из этого URL Статистика:

http://stats.nba.com/stats/leaguedashteamstats?Conference=&DateFrom=&DateTo=&Division=&GameScope=&GameSegment=&LastNGames=0&LeagueID=00&Location=&MeasureType=Base&Month=0&OpponentTeamID=0&Outcome=&PORound=0&PaceAdjust=N&PerMode=PerGame&Period=0&PlayerExperience=&PlayerPosition=&PlusMinus=N&Rank=N&Season=2016-17&SeasonSegment=&SeasonType=Regular+Season&ShotClockRange=&StarterBench=&TeamID=0&VsConference=&VsDivision=

При просмотре веб-страницы/URL в современном браузере, больше запросов сделаны «за сцена " кроме исходного URL-адреса, который вы используете , чтобы полностью отобразить страницу.

Я знаю, что это звучит контр-интуитивно понятным, вы можете проверить this answer для получения более подробного объяснения.

0

Попробуйте этот код. Это дает мне HTML-код. Я использую запросы для получения информации.

import datetime 
    import BeautifulSoup 
    import os 
    import sys 
    import pdb 
    import webbrowser 
    import urllib2 
    import requests 
    from datetime import datetime 
    from requests.auth import HTTPBasicAuth 
    from HTMLParser import HTMLParser 
    from urllib import urlopen 
    from bs4 import BeautifulSoup 
    url="http://stats.nba.com/teams/traditional/" 
    data=requests.get(url) 

    if (data.status_code<400): 
     print("AUTHENTICATED:STATUS_CODE"+" "+str(data.status_code)) 
     sample=data.content 
     soup=BeautifulSoup(sample,'html.parser') 
     print soup 
0

Вы можете использовать селен и PhantomJS (или chomedriver, светлячок и т.д.), чтобы загрузить страницу, таким образом, также загружаются все JavaScript. Все, что вам нужно, это загрузить селен и веб-навигатор PhantomJS, а затем поместить таймер сна после получения (url), чтобы обеспечить загрузку страницы (фактически, использование такой функции, как WebDriverWait, будет намного лучше, чем сон, но вы можете посмотреть больше в это, если вам это нужно). Теперь ваше содержимое супа будет выглядеть так же, как вы видите при просмотре сайта через ваш браузер.

from bs4 import BeautifulSoup 
from selenium import webdriver 
from time import sleep 

url = 'http://stats.nba.com/teams/traditional/' 
browser = webdriver.PhantomJS('*path to PhantomJS driver') 
browser.get(url) 

sleep(10) 

soup = BeautifulSoup(browser.page_source, "html.parser") 
for table in soup.find_all('tr'): 
    print(table)