python - 为什么 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,昨天更新了。我在教程中从网站复制了我的用户代理信息。
为了访问网站上的表格,我需要更改/更新什么?
解决方案
由于数据是使用 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)
推荐阅读
- c++ - 如何获取路由器信息
- digital-signature - 使用数字签名证书签署的文件在签署后的有效期为多久?
- mysql - 如何检查两个 MySQL 表中两次之间的差异?
- bigdata - 通过高维名义属性预测数字属性
- jsp - JSTL - 输入类型=“数字”的十进制格式
- ruby-on-rails - 已审计:与 HABTM 关系相关的审计
- java - Java .dll 文件在 .jar 中不起作用
- ios - 目标 C - 具有多个测试输入的单元测试的最佳实践
- ios - 如何使用 NEPacketTunnelProvider 获取完整的 URL?
- php - 在 PHP 5.6 getimagesize() 中禁用 SSL