Scrapy无法废弃物品,xpath无法正常工作

时间:2017-02-27 11:02:10

标签: xpath scrapy

我花了很多时间试图在没有成功的情况下废除信息。 我的目标是浏览类别和每个项目的废品标题,价格和标题的href链接。

问题似乎来自parse_items函数。我用firepath检查了xpath,我可以根据需要选择项目,所以也许我只是不知道scrapy如何处理xpath ......

这是我的代码

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.selector import Selector
from ..items import electronic_Item


class robot_makerSpider(CrawlSpider):
    name = "robot_makerSpider"
    allowed_domains = ["robot-maker.com"]
    start_urls = [
        "http://www.robot-maker.com/shop/",
    ]

    rules = (

        Rule(LinkExtractor(
            allow=(
                "http://www.robot-maker.com/shop/12-kits-robots",
                "http://www.robot-maker.com/shop/36-kits-debutants-arduino",
                "http://www.robot-maker.com/shop/13-cartes-programmables",
                "http://www.robot-maker.com/shop/14-shields",
                "http://www.robot-maker.com/shop/15-capteurs",
                "http://www.robot-maker.com/shop/16-moteurs-et-actionneurs",
                "http://www.robot-maker.com/shop/17-drivers-d-actionneurs",
                "http://www.robot-maker.com/shop/18-composants",
                "http://www.robot-maker.com/shop/20-alimentation",
                "http://www.robot-maker.com/shop/21-impression-3d",
                "http://www.robot-maker.com/shop/27-outillage",
                ),
            ),
            callback='parse_items',
        ),
    )


    def parse_items(self, response):
        hxs = Selector(response)
        products = hxs.xpath("//div[@id='center_column']/ul/li")
        items = []

        for product in products:
            item = electronic_Item()
            item['title'] = product.xpath(
                "li[1]/div/div/div[2]/h2/a/text()").extract()
            item['price'] = product.xpath(
                "div/div/div[3]/div/div[1]/span[1]/text()").extract()
            item['url'] = product.xpath(
                "li[1]/div/div/div[2]/h2/a/@href").extract()

            #check that all field exist
            if item['title'] and item['price'] and item['url']:
                items.append(item)
        return items

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

蜘蛛中的xpath确实有问题。

您的产品的第一个xpath确实有效,但它不够明确,可能很容易失败。虽然产品细节xpath根本不起作用。

我已经使用了它:

products = response.xpath("//div[@class='product-container']")
items = []

for product in products:
    item = dict()
    item['title'] = product.xpath('.//h2/a/text()').extract_first('').strip()
    item['url'] = product.xpath('.//h2/a/@href').extract_first()
    item['price'] = product.xpath(".//span[contains(@class,'product-price')]/text()").extract_first('').strip()

所有现代网站都有非常易于解析的html源代码(因为他们需要自己解析它们的css样式和javascript函数)。

因此,通常您应该查看要使用浏览器检查工具(右键单击 - >检查元素)提取的节点的类和ID名称,而不是使用某些自动选择工具。它更可靠,一旦掌握了它就不需要做太多工作。