Web scraping 刮网错误返回

Web scraping 刮网错误返回,web-scraping,beautifulsoup,Web Scraping,Beautifulsoup,我正试着用Python漂亮的汤来上网。我想从英超联赛中获得数据,见下页。在此代码之后,我的返回与网站中的数据不匹配。 请复习和帮助。我怀疑这可能是因为分页——我想从EPL 2017/18中调出关于“wins”的数据 从bs4导入美化组 导入请求 导入json url=”https://www.premierleague.com/stats/top/clubs/wins?se=79T" data=requests.get(url).text soup=BeautifulSoup(数据,“html.

我正试着用Python漂亮的汤来上网。我想从英超联赛中获得数据,见下页。在此代码之后,我的返回与网站中的数据不匹配。 请复习和帮助。我怀疑这可能是因为分页——我想从EPL 2017/18中调出关于“wins”的数据

从bs4导入美化组
导入请求
导入json
url=”https://www.premierleague.com/stats/top/clubs/wins?se=79T"
data=requests.get(url).text
soup=BeautifulSoup(数据,“html.parser”)
PLtable=soup.find_all('table')[0]
数据=[]
对于PLtable中的td。查找所有(“td”):
data.append(td.text.replace('\n','.strip())

改进您的问题将有助于让所有人都更容易理解和帮助

发生了什么事?

  • 您尝试获取特定时间段的统计信息,代码运行良好
  • 问题是,网站在默认情况下呈现的统计数据不在您的时段内,它呈现的是所有季节的统计数据,并在一秒钟后过滤统计数据
  • 请求没有得到这个,它仍然会得到所有季节的统计数据
您可以使用selenium-简单示例

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

url = 'https://www.premierleague.com/stats/top/clubs/wins?se=79T'

browser = webdriver.Chrome(executable_path=r'C:\Program Files\ChromeDriver\chromedriver.exe')
browser.get(url)

sleep(5)

soup=BeautifulSoup(browser.page_source,"html.parser")
PLtable = soup.find('tbody', class_='statsTableContainer')

data = []
for td in PLtable.find_all("td"):
      data.append(td.text.replace('\n', ' ').strip()) 
print(data)

browser.close()  
输出

['1.', 'Leicester City', '9', '', '2.', 'Liverpool', '9', '', '3.', 'Everton', '8', '', '4.', 'Manchester United', '8', '', '5.', 'Aston Villa', '7', '', '6.', 'Southampton', '7', '', '7.', 'Tottenham Hotspur', '7', '', '8.', 'Chelsea', '6', '', '9.', 'Manchester City', '6', '', '10.', 'West Ham United', '6', '', '11.', 'Wolverhampton Wanderers', '6', '', '12.', 'Crystal Palace', '5', '', '13.', 'Leeds United', '5', '', '14.', 'Newcastle United', '5', '', '15.', 'Arsenal', '4', '', '16.', 'Brighton and Hove Albion', '2', '', '17.', 'Burnley', '2', '', '18.', 'Fulham', '2', '', '19.', 'West Bromwich Albion', '1', '']

通过api以json格式加载的数据。请参见下面代码中的api url

from bs4 import BeautifulSoup
import requests

import json

url = 'https://footballapi.pulselive.com/football/stats/ranked/teams/wins?page=0&pageSize=20&compSeasons=79&comps=1&altIds=true'

headers = {
    "Host": "footballapi.pulselive.com",
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0",
"Accept": "*/*",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate, br",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "https://www.premierleague.com",
"Connection": "keep-alive",
"Referer": "https://www.premierleague.com/stats/top/clubs/wins?se=79",
"If-None-Match": "083bcdbc679be42363d2eaefe7e90df5b",
"TE": "Trailers",


}

results = requests.get(url, headers=headers).json()

for data in results['stats']['content']:
    print(data['owner']['name'], data['value'])

如果运行print(soup.prettify()),它将显示从站点检索到的所有HTML。它包括HTML吗?谢谢,是的!DOCTYPE html,这就是我得到的。但是,提取的数据与webgethat中的数据完全不同,这很可能是因为web页面使用JavaScript生成内容。请求/靓汤无法处理此问题。一种方法是使用selenium,或者如果可能的话直接调用API。非常感谢,我正在使用Jupyter online,无法获得selenium中的webdriverwebdriver,我在这里没有使用selenium。如果正确解决了您的问题,请将答案标记为已接受:)谢谢,这非常有帮助