首页 > 解决方案 > 为什么 BeautifulSoup 一直说我需要更新浏览器?

问题描述

我正在尝试使用 bs4 将 PGA Tour 网站上的排行榜表拉到数据框中。我是 HTML 新手,也是 Python 的新手。使用示例网站(例如“https://www.dataquest.io/blog/web-scraping-tutorial-python/”)完成 bs4 教程时,一切都与示例一样,但以下代码:

from bs4 import BeautifulSoup
import requests

url = 'https://www.pgatour.com/leaderboard.html'
headers = {"User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'}
page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.content, 'html.parser')
table_body = soup.find('table')
rows = table_body.find_all('tr')
for row in rows:
    cols=row.find_all('td')
    cols=[x.text.strip() for x in cols]
    print(cols)

给我错误信息:

['', '看来您的浏览器可能已经过时了。为获得最佳网站体验,我们建议您更新浏览器。\xa0\n \n \n 了解更多', '']

我的默认浏览器是 Chrome,昨天更新了。我在教程中从网站复制了我的用户代理信息。

为了访问网站上的表格,我需要更改/更新什么?

标签: pythonhtmlweb-scrapingbeautifulsoup

解决方案


由于数据是使用 javascript 加载的,因此无法使用漂亮的汤,正如 Anon 评论的那样。

您可以改用 selenium 获取数据,它可以处理 javascript。下面的代码段将收集排行榜表行。

基本上它的作用是:

  • 加载页面
  • 等到排行榜表在页面上可见
  • 当表格可见时,使用 xpath 获取所有行项目

但是:请注意,您需要使用 chromedriver(或任何其他 webdriver),并在下面的代码段中更改驱动程序路径。由于在maven项目中使用它,我的路径如下所示,因此取决于您安装驱动程序的位置。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

url = "https://www.pgatour.com/leaderboard.html"
driver_path = '/Users/USERNAME/.m2/repository/driver/chromedriver/chromedriver' #Path to your chromedriver used by selenium
driver = webdriver.Chrome(driver_path)
driver.maximize_window()
driver.get(url)
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "stroke-play-container")))
rows = driver.find_elements_by_xpath('//*[@id=\"stroke-play-container\"]/div/div/div/table/tbody')
for row in rows:
    print(row.text)

推荐阅读