【问题标题】:Calling HTML tags from another file in Scrapy spider class and parse them从 Scrapy 蜘蛛类中的另一个文件调用 HTML 标签并解析它们
【发布时间】:2020-08-10 20:59:36
【问题描述】:

我是 Python 和 Scrapy 的新手。所以,我不知道是否可以实现以下场景。 因此,请告诉我是否可能。

我知道 Scrapy 通常是这样工作的:

import scrapy
from scrapy.loader import ItemLoader
from ..items import Allitems

class newspider(scrapy.Spider):
    name = "my_code"
    start_urls = ['URL_Name']

    def parse(self, response):
        class_name = ".product-list--list-item" 
        product_name_tag = "./div/div[1]/div/div[1]/div[1]/div[1]/h3/a/text()"
   
        selector1 = response.css(class_name)

        for items in selector1:
            loader = ItemLoader(item=Allitems(), selector=items)
            loader.add_xpath('Product_Name', product_name_tag)
            yield loader.load_item()

如何创建一个文件,我可以在其中添加在变量中声明的所有 HTML 标签,并在 Spider 类中调用它们并通过选择器解析这些 HTML 标签?

例如-

Sample.txt:

class_name = ".product-list--list-item" 
product_name_tag = "./div/div[1]/div/div[1]/div[1]/div[1]/h3/a/text()"

蜘蛛文件:

import scrapy
from scrapy.loader import ItemLoader
from ..items import Allitems

class newspider(scrapy.Spider):
    name = "my_code"
    start_urls = ['URL_Name']

def parse(self, response):

*** Call Sample.txt ***

            selector1 = response.css(class_name)
            for items in selector1:
                loader = ItemLoader(item=Allitems(), selector=items)
                loader.ad+d_xpath('Product_Name', product_name_tag)
                yield loader.load_item()

在所有网站中,HTML 标签可能会发生变化。因此,我想将 HTML 标签声明单独保存在一个文件中,并在另一个文件中解析和抓取每个项目。

【问题讨论】:

  • 我的建议是考虑 xpath 选择器,它们是广泛的并且依赖于属性而不是像 div/div[1]/div/div[1]/div[1]/div 这样的多个子元素[1]/h3/a/text() 你在那里。而不是使用选择器的文本文件。如果没有发生刮擦,则更改代码与编辑文本文件之间没有太大区别。例如 response.xpath(//div[contains(@class,"ATTRIBUTE")]') 非常广泛。
  • @AaronS 是的,我接受你的观点。在大多数情况下,我会使用广泛并依赖于属性。只有在少数情况下,我使用了多个子元素。我将很快将其更改为广泛的属性。无论如何,我想将 HTML 标签保存在一个单独的文件中,并在 Spider 类中调用它们进行解析。如果有办法,那真的很有帮助。

标签: parsing scrapy css-selectors


【解决方案1】:

我建议创建一个sample.py(而不是您的 sample.txt),以便您可以导入变量。您仍然可以使用.txt 来执行此操作,但您必须将其加载为文本文件并对其进行解析。虽然拥有sample.py 允许精确导入:

import scrapy
from scrapy.loader import ItemLoader
from ..items import Allitems
from sample import class_name, product_name_tag  


class newspider(scrapy.Spider):
    name = "my_code"
    start_urls = ['URL_Name']

def parse(self, response):

    selector1 = response.css(class_name)
    for items in selector1:
        loader = ItemLoader(item=Allitems(), selector=items)
        loader.ad+d_xpath('Product_Name', product_name_tag)
        yield loader.load_item()

【讨论】:

  • 很好的答案@renatodvc。感谢你的帮助。由于我对 Python 非常陌生,因此我找不到这个解决方案。无论如何,我试图投票,但由于我的声誉很低,我不能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多