javascript - 如何使用 Python 加载包含 js.download 元素的 HTML 文档
问题描述
我正在尝试从显示有关出售汽车的搜索结果的网页中收集数据。
在线文档的结构并不太复杂,我能够根据data-testid
每个返回的汽车记录所具有的某个属性来挑选出有趣的信息。
根据该属性的子串特征,我可以找到不同的有趣信息,如价格、未注册年份、里程等。
我beautifulsoup
用来解析 HTML 并requests
最初从 Web 加载 HTML 文档。
现在,问题来了。在某种程度上,我无法预测,也无法找到逻辑,返回的 HTML 在requests.get()
某种程度上是不完整的。在一个有 100 个结果的页面中,当我在线检查页面时可以看到(并且我可以跟踪有 100 个data-testid
字段,其中包含价格的特定子字符串,里程数为 100 等等......),返回的 HTMLrequests.get()
是与我可以通过页面本身的“另存为”操作获得的方式相同,仅包含这些字段的一部分。
他们的数量也是不可预测的。
我开始问为什么在线和保存的 HTML 之间存在这种差异。到目前为止还没有完整的回应,但在评论中暗示页面有点动态加载JavaScript
。我很高兴发现将页面连同所有文件一起保存到磁盘以某种方式生成了完整的 HTML,然后我可以在没有进一步问题的情况下对其进行解析。
然而,我的喜悦只持续了那个特定的搜索。当我需要尝试一个新的时,我突然又回到了原点。通过进一步调查,我得出了目前的理解,这就是问题的根源:我注意到,当我将在线页面保存为“网页,完成”(创建一个 .html 文件和一个文件夹)时,这个组合肯定包含所有记录。我可以这样说,因为如果我离线并双击新保存的 html,我可以看到所有在线记录(本例中为 100 条)。然而,HTML 文件本身只包含其中的几个!!!
因此,我的推论是,其余记录必须“隐藏”在节省时间创建的文件夹中,我倾向于说它可以嵌入那些(许多)*.js.download 文件中:
我的问题是:
- 我的假设正确吗?其他记录存储在那些文件中?
- 如果是,在解析 HTML 时如何使它们“显式”
beautifulsoup
?
更新 07/05
我已尝试requests_html
按照评论和此答案中的建议安装和使用。它的render()
方法看起来很有希望,但是我可能并不真正理解此处requests_html
文档中解释的机制(渲染 JS 部分),因为即使在以下操作之后(伪代码)
from requests_html import HTMLSession
session = HTMLSession()
r = session.get(URL)
r.html.render()
在这一点上,我希望“强制”该网站“吐出”所有 HTML,包括那些仍然以某种方式隐藏并且只显示在实时页面中的位。然而,连续转储r.html.html
到文件中,仍然返回相同的旧 5 条记录(为什么现在有 5 条,当其他搜索返回 12 条,甚至 60 条时,对我来说完全是个谜)。
解决方案
推荐阅读
- github - 使用jenkins pipeline dsl构建jar并从github下载
- javascript - 设计有关处理程序的 React 组件架构的最佳方法是什么?
- java - 线程“pool-1-thread-1”中的异常 java.lang.NullPointerException:无法调用“java.util.Map.entrySet()”,因为“contextMap”为空
- azure - Azure 突触分析并行插入临时表
- javascript - 如何在对象内部声明钩子?
- spring-boot - SpringBoot/K8S/Apache CXF WS 的随机 APR/本机套接字错误
- geolocation - 如何从 Safari 网络扩展中获取用户的地理位置
- tensorflow - Tensorflow EarlyStopping 过早停止
- docker - docker-compose - 如何将 env 变量从 .env 传递到 Dockerfile?
- android - AssetLinks 文件预期流量和故障场景