2016-08-03 130 views
-4

Scrapy是一个网络爬虫,我创建了一个蜘蛛。 我想要蜘蛛创建2个链接的正文2个HTML文件。 创建的html文件是空的。为什么这个xpath表达式不起作用?

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

请重新访问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())

例如,选择全部div元素hero,使用response.xpath("//div[@class = 'hero']")

也许你应该先阅读一些关于XPath的基本教程。在这里学习不会有效,你需要首先弄清楚基础知识。

+0

什么其他xpath表达式将工作复制body.I尝试response.xpath(“//body”)。extract()并没有工作。我知道response.body工作,但我想学习xpath。 – user6658170

+0

这将有助于您澄清您的问题,以确定您最终会在HTML文件中达到什么目的。如果您只是希望将它们写入到服务器返回的光盘中,则完全不需要XPath。 – Markus

+0

我希望html文件包含body元素。一旦有效,我将收集所有具有特定类的div元素。 – user6658170

相关问题