使用Scrapy从包含特定值的located标记上移或下移一个div

eni9jsuy  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(136)

我需要从自定义控件/标签/字体样式中检索价格文本。识别价格属于哪个值的唯一方法是数据编号data-number="025.00286R"。末尾的字母是区分不同控制部分div的唯一元素。

<div class="custom-control custom-checkbox">
   <input type="checkbox" class="custom-control-input" data-number="025.00286R" name="itemSelected[]" value="7684cd019b98489eb330010000039848" id="checkbox-7684cd019b98489eb330010000039848">
   <label class="custom-control-label" for="checkbox-7684cd019b98489eb330010000039848">
      <meta itemprop="price" content="676.0512">
      <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      €676.05
      </font></font>
   </label>
</div>

字符串
我使用以下代码来检索页面中data-number的总数:

box_contents = response.css('div[class*="mad-article-list-box"]').re(r"[0-9]+.\d+[0-9][A-Z]+")
box_contents = list(dict.fromkeys(box_contents))


因此,框内容以列表的形式呈现(对于列表中的每个数字,都有一个相同的custom control类:

['025.00286GA', '025.00286GV', '025.00286NWA', '025.00286NW', '025.00286NWV', '025.00286R']


现在的问题是<input type="checkbox"不包含任何子div,我需要它下面的div的嵌套文本内容。<label class="custom-control-label"
我可以通过以下方式找到<input

response.xpath('//input[contains(@data-number, "' + box_contents[0] + '")]')


但是,现在我需要在找到<input type="checkbox"之后在xpath中增加1,或者在xpath中减少1。在此之后,很容易提取所有嵌套的文本和我要查找的值€676.05。我该怎么做呢?有没有更好的方法来实现这一点?

v2g6jxz6

v2g6jxz61#

您可以使用custom-control类分别遍历每个div元素,并一次提取每个复选框和标签的信息,而不是一次收集所有这些信息。然后,这两段数据已经配对,因为你将一次迭代一对,并且因为你将从两个数据元素的父元素开始,找到每个元素的正确路径更加简单。
举例来说:

html = """
<div class="custom-control custom-checkbox">
   <input type="checkbox" class="custom-control-input" data-number="025.00286R" name="itemSelected[]" value="7684cd019b98489eb330010000039848" id="checkbox-7684cd019b98489eb330010000039848">
   <label class="custom-control-label" for="checkbox-7684cd019b98489eb330010000039848">
      <meta itemprop="price" content="676.0512">
      <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      €676.05
      </font></font>
   </label>
</div>
"""

import parsel
selector = parsel.Selector(html)

for control in selector.xpath("//div[@class='custom-control custom-checkbox']"):
    data_number = control.xpath("./input/@data-number").get()
    price = control.xpath(".//meta/@content").get()
    print({"data_number": data_number, "price": price })

字符串
产出

{'data_number': '025.00286R', 'price': '676.0512'}

相关问题