2016-08-03 137 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

相關問題