为什么这个xpath表达式不起作用?

时间:2016-08-03 14:20:10

标签: python xpath scrapy

Scrapy是一个网络爬虫,我创建了一个蜘蛛。 我希望蜘蛛用2个链接的主体创建2个html文件。 创建的html文件为空。

    import scrapy
    from scrapy.selector import Selector
    from scrapy.http import HtmlResponse

    class DmozSpider(scrapy.Spider):
        name = "dmoz"
        allowed_domains = ["dmoz.org"]
        start_urls = [
       "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
       "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]

        def parse(self, response):
            x=response.xpath("//body/text()").extract()
            filename = response.url.split("/")[-2] + '.html'
            with open(filename, 'wb') as f:
                f.write(x)

1 个答案:

答案 0 :(得分:-1)

请重新访问Scrapy tutorial并仔细检查;您的示例基本上是dmoz_spider.py的逐字副本。

首先,请注意xpath()会返回一个选择器列表。在选择器列表上调用extract()会为您提供一个unicode字符串列表,您无法按原样将其写入文件。您需要加入字符串并对结果进行编码(例如,使用UTF-8)。

with open(filename, 'wb') as f:
    f.write(u"".join(x).encode("UTF-8"))

至于它为什么现在不工作:使用XPath表达式选择body元素的所有文本节点。由于文本节点仅包含空格字符,因此创建的文件显示为空。

response.xpath("//body/text()").extract()的结果是[u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n ', u'\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n '],因此您的文件应包含一些空格字符。

要选择body元素下的所有节点,请使用response.xpath("//body/node())

例如选择具有班级div的所有hero元素,使用response.xpath("//div[@class = 'hero']")

也许你应该先阅读一些关于XPath的基础教程。从实践中学习在这里不起作用,你真的需要先掌握基础知识。