首页 > 解决方案 > 如何使用 Python 加载包含 js.download 元素的 HTML 文档

问题描述

我正在尝试从显示有关出售汽车的搜索结果的网页中收集数据。

在线文档的结构并不太复杂,我能够根据data-testid每个返回的汽车记录所具有的某个属性来挑选出有趣的信息。

数据-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 文件中:

在此处输入图像描述

我的问题是:

更新 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 条时,对我来说完全是个谜)。

标签: javascriptpythonhtml

解决方案


推荐阅读