python - 相同的 CSS,不同的浏览器结果和 bs4 .select() 方法
问题描述
我正在尝试从以下网页检索一些信息: https ://web.archive.org/web/19990421025223/http://www.rbc.ru
我构建了一个选择器,它在 Chrome 的检查模式下突出显示了所需的表:
selector = 'body > table:nth-of-type(2) > tbody:nth-of-type(1)>tr:nth-of-type(1)>td:nth-of-type(5)>table:nth-of-type(1)>tbody:nth-of-type(1)'
但是,当使用 bs4 .select() 方法运行脚本时:
import requests
from bs4 import BeautifulSoup
import lxml
url = 'https://web.archive.org/web/19990421025223/http://www.rbc.ru'
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
}
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.content, 'lxml')
selector = 'body > table:nth-of-type(2) > tbody:nth-of-type(1)>tr:nth-of-type(1)>td:nth-of-type(5)>table:nth-of-type(1)>tbody:nth-of-type(1)'
print(soup.select(selector=selector))
输出是: [] - 这与预期的非常不同,因为它由浏览器中的 html 代码组成。
我在这里想念什么?
解决方案
您不能期望浏览器生成的选择器能够可靠地工作,BeautifulSoup
因为当在浏览器中呈现页面时,标记会发生变化,而当您在 Python 代码中下载页面时,没有呈现,您只会得到最初的未呈现HTML 页面。
在这里,您必须想出自己的 CSS 选择器或其他方式来定位table
元素。
由于页面的标记并不是真正的 HTML 解析友好,我会table
通过其中一个列名来定位一个元素:
table = soup.find("b", text="спрос").find_parent("table")
请注意,它仅在我使用宽松的html5lib
解析器解析页面时才对我有用:
soup = BeautifulSoup(response.content, "html5lib")
推荐阅读
- swift - 使用 DiskArbitration 和 IOKit 获取所有卷的树状结构
- android - 如何在 Android 11 上获取请求所有文件访问权限
- python - 3D t-sne 的特定标记
- node.js - 推送被拒绝,在 heroku 上部署 nodejs 应用程序时无法编译 Node.js 应用程序
- netsuite - 以编程方式安排地图缩减脚本
- python - Pygame 窗口不会出现在 Jupyter 中
- angular - Angular 从多个 http 服务获取数据并映射它们
- excel - 为什么将我的数组读入 VBA 中的单元格时,它会重复每一行?
- python - 如何判断列表中的项目何时在 Python 中更改了位置
- java - 每个新会话都需要 dbms_java.grant_permission