Python和美丽的汤网页刮
问题描述:
我想刮这个网页上的表的统计信息:http://stats.nba.com/teams/traditional/但我无法找到该表的HTML。这是在Python 2.7.10。Python和美丽的汤网页刮
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)
这是我现在的代码,但没有输出。 如果我尝试使用页面上的不同元素,它工作正常。
答
表格是动态加载的,所以当你抓取html时,其中没有tr
标签可以找到。
答
您正在查找的表格不在该特定页面/网址中。
你想凑来自这个网址的统计:
当你浏览网页/ URL在现代浏览器,更多的请求是由“幕后黑手现场“以外的原始网址使用来完全呈现整个页面。
我知道这听起来反直觉,你可以检查出this answer有一些更详细的解释。
答
试试看看这个代码。它给了我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
答
您可以使用硒和PhantomJS(或chomedriver,firefox等)加载页面,从而也加载所有的JavaScript。您只需要下载硒和PhantomJS webdriver,然后在get(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)
表值通过JavaScript渲染,所以你将需要一个JavaScript解析器来获得的值,而不是BeautifulSoup – smoggers
你有一个JavaScript分析器的建议? – johnbowman
如果您知道数据来自哪里,那么您并不需要使用JavaScript解析器,在这种情况下,它是http://stats.nba.com/stats/leaguedashteamstats?Conference=&DateFrom=&DateTo=&Division=&GameScope=&GameSegment =&LastNGames = 0&LeagueID = 00&位置=&MeasureType =基地&月= 0&OpponentTeamID = 0&结果=&PORound = 0&PaceAdjust = N&PerMode = PerGame&周期= 0&PlayerExperience =&PlayerPosition =&PlusMinus = N&排名= N&季节= 2016-17&SeasonSegment =&SeasonType =普通+季&ShotClockRange =&StarterBench =&TeamID = 0&VsConference =&VsDivision = – Shane