【问题标题】:Why is this xpath expression not working?为什么这个 xpath 表达式不起作用?
【发布时间】:2016-08-03 14:20:10
【问题描述】:

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)

【问题讨论】:

    标签: python xpath scrapy


    【解决方案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 '],因此您的文件应该包含一些空白字符。

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

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

    也许您应该先阅读一些有关 XPath 的基本教程。在这里边做边学是行不通的,你真的需要先搞清楚基础知识。

    【讨论】:

    • 其他 xpath 表达式可以用来复制正文。我尝试了 response.xpath("//body").extract() 但它没有用。我知道 response.body 有效,但我想学习 xpath。
    • 如果您能澄清您希望最终在 HTML 文件中得到什么的问题,将会有所帮助。如果您只想将它​​们写入服务器返回的光盘,则根本不需要 XPath。
    • 我希望 html 文件包含正文元素。一旦可行,我将收集具有特定类的所有 div 元素。
    • 您的代码对我来说有意义,但文件仍然是空的。
    • 好吧,您不能只将 unicode 字符串列表传递给 write()。查看更新的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    相关资源
    最近更新 更多