【问题标题】:Scraping data between two spans scrapy在两个跨度之间抓取数据
【发布时间】:2020-07-13 02:16:02
【问题描述】:

我正在抓取网页,想在第一页获取所有产品的价格信息。下面是网页的html。我要99。

<div class = 'item-bg'>
    <div class = 'product-box'>
        <div class = 'res-info'>
            <div class = 'price-box'>
                <span class = 'def-price selectorgadget_rejected'>
                    <i>$</i>
                    99
                    <i>.99</i>
                </span>
            </div>
        </div>
    </div>
</div>

我认为我不能使用 def-price 类,因为有些产品有“selectorgadget_rejected”,有些产品后面有“selectorgadget_suggested”。 我现在的代码是

product_info = response.css('.item-bg')
for product in product_info:
    product_price_sn = product.css('.price-box').extract() 

它没有达到 99,我不知道如何解决它。有什么想法吗?

以下是完整 HTML 信息的屏幕截图:

【问题讨论】:

    标签: python css xpath scrapy web-crawler


    【解决方案1】:

    我总是更喜欢使用 XPath 而不是 CSS。在 XPath 中,您可以使用 contains 函数来指定要选择的类,例如:

    response.xpath('//span[contains(@class, "def-price selectorgadget")]//text()').extract() 
    
    • 这将从 ALL 页面中的 &lt;span&gt; 标签中提取文本,该标签包含 def-price selectorgadget 表达式,无论是 selectorgadget_rejected 还是 selectorgadget_suggested

    或者使用预选的product_info

    product_info = response.css('.item-bg')
    for product in product_info:
        product_price_sn = product.xpath('div/div/div/span[contains(@class, "def-price selectorgadget")]//text()').extract() 
    

    使用完整路径,因为只发布了 HTML 的 sn-p

    如果您只想要 99 个 outside,则 &lt;i&gt; 标签使用 /text() 而不是 //text()


    CSS 选择器

    现在,如果您想坚持使用 CSS 选择器,这可能可以工作:

    product.css('.price-box span::text').extract()
    

    【讨论】:

    • 我使用了代码product_price_sn = product.xpath('div/div/div/span[contains(@class, "def-price selectorgadget")]//text()').extract(),但它什么也没得到?当我运行蜘蛛时,它会在终端中打印 []。我不确定是不是因为之前只提供了html的sn-p?我上传了完整 html 的截图。
    • 嗨@TianheXie 首先,你能确保你得到这个response.xpath('//span[contains(@class, "def-price selectorgadget")]//text()').extract() 的回报吗?如果可以的话,你也可以试试product.xpath('//span[contains(@class, "def-price selectorgadget")]//text()').extract()吗?
    • 我还建议使用 get() 方法而不是 extract_first() 和 getall() 而不是 extract。只是另一个小提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多