首页 > 解决方案 > 使用 xpath 提取图像

问题描述

我一直在尝试从该网站获取信息https://www.leadhome.co.za/property/poortview-ah/roodepoort/lh-95810/magnificent-masterpiece-in-poortview-我在获取所有信息时遇到问题该物业的图像;更具体地说是 URL

这就是类的样子:

<div class="lazy-image listing-slider-carousel-item lazy-image-loaded">
   <div class="lazy-image-background" style="background-image: url(&quot;https://s3-eu-west-1.amazonaws.com/leadhome-listing-photos/025c90ab-9c87-47d5-b11c-1cfbce3f67f2-md.jpg&quot;);"></div>
</div>

到目前为止我所拥有的:

        for item in response.xpath('//div[@class="lazy-image-background"]/*[starts-with(@style,"background-image")]/@style').getall():
            yield {"image_link":item}

但不幸的是,这是空的。关于我做错了什么的任何提示?谢谢!

标签: pythonhtmlxpathweb-scrapingscrapy

解决方案


如果您检查此网页的原始 html 源代码(谷歌 Chrome 浏览器上的 CTRL + U,!!!不是来自 Crhome 开发人员工具/元素部分的 html 代码)
,您将看到 2 个重要的事情:

  1. 标签中的图像<div class="lazy-image listing-slider-carousel-item lazy-image-loaded">以及其他数据不存在于这些 html 标签中。
  2. 存储在script标签内和window.REDUX_INITIAL_STATEjavascript 变量内的所有数据:

    原始html源

dict在这种情况下,我们可以使用 python 的内置json模块将数据从 javascript 变量转换为基本的 python格式。
此任务中最复杂的部分是将该script标签的内容正确匹配到json.loads函数中。它应该是window.REDUX_INITIAL_STATE =下一个 javascript 操作之后和之前的严格文本(在这种情况下,在最新;符号之前)。结果,我们将得到以下代码:

def parse(self, response):
    script_tag = [script for script in response.css("script::text").extract() if "window.REDUX_INITIAL_STATE = {" in script]
    script_data = json.loads(script_tag[0].split("window.REDUX_INITIAL_STATE = ")[-1][:-1], encoding="utf-8")

正如您在以下调试器屏幕截图中看到的,所有数据都已成功转换: debugger_converted_data 图像存储在script_data['app']['listing']['listing']['entity']['lh-95810']['images']字典列表中: 是实体 ID,因此在更新的代码中,将单独选择该实体 ID,以便能够在其他页面中使用它:调试器图像 lh-95810

def parse(self, response):
    script_tag = [script for script in response.css("script::text").extract() if "window.REDUX_INITIAL_STATE = {" in script]
    script_data = json.loads(script_tag[0].split("window.REDUX_INITIAL_STATE = ")[-1][:-1], encoding="utf-8")
    entity_key = [k for k in script_data['app']['listing']['listing']['entity'].keys()]
    images = [image["medium"] for image in script_data['app']['listing']['listing']['entity'][entity_key[0]]['images']]

本网站使用 javascript 在网页上呈现数据。但是,任何 javascript 形成的内容都具有原始 html 代码中的 *roots。这种方法仅使用内置json模块,不需要 css 或 Xpath 选择器。


推荐阅读