2017-06-25 51 views
0

我剛開始使用XPath進行html抓取,所以我對語法有點困惑。我試圖從SOURSE代碼的下面的代碼片段提取網址:使用XPATH擦掉屬性值?

<a href="/realestateandhomes-detail/15645-SW-74th-Circle-Dr-Apt-5_Miami_FL_33193_M69309-37779"> 
     <img alt="15645 Sw 74th Circle Dr Apt 5, Miami, FL 33193" title="15645 Sw 74th Circle Dr Apt 5, Miami, FL 33193" class="js-srp-listing-photos" itemprop="image" data-src="https://ap.rdcpix.com/1980533383/49e7a93da461352c04b8e7146a8d2ceel-m0xd-w480_h480_q80.jpg" data-omtag="srp-listMap:result:photo" src="https://ap.rdcpix.com/1980533383/49e7a93da461352c04b8e7146a8d2ceel-m0xd-w480_h480_q80.jpg" /> 
    </a> 

html的路徑如下:

<body> 
    <li> 
    <div> 
     <a></a> 

我使用scrapy來解析HTML頁面,這是我的到目前爲止的代碼:

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from realtor.items import RealtorItem 
class RealtorSpider(BaseSpider): 
    name = "realtor" 
    allowed_domains = ["realtor.com"] 
    start_urls = [ 
     "http://www.realtor.com/realestateandhomes-search/Miami_FL" 
     ] 
    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     sites = hxs.select('//li/div/a/@href') 
     items = [] 
     for site in sites: 
      item = RealtorItem() 
      item['link'] = site.select('div/a/@href').extract() 
      items.append(item) 
     return items 

當我運行它返回在即項[] = site.select()線16的錯誤代碼中提取()。我不確定語法是否正確,或者我缺少另一個潛在問題。

誤差

KeyError: 'RealtorItem does not supprot field: link' 

我items.py代碼如下:

from scrapy.item import Item, Field 
class RealtorItem(Item): 
    link = scrapy.Field() 
+0

您使用的是scrapy的什麼版本? –

+0

它是scrapy v 1.4.0 –

回答

0

您正在嘗試使用這個選擇//li/div/a/@href提取href屬性,然後通過每個提取的迭代元素,但是實際上您在提取href屬性中的提取文本時做了什麼,在再次使用//li/div/a/@href選擇器時不會獲取任何內容。

下面是scrapy較新的版本中實現你的蜘蛛類

import scrapy 

class RealtorSpider(scrapy.Spider): 
    name = "realtor" 
    allowed_domains = ["realtor.com"] 
    start_urls = [ 
     "http://www.realtor.com/realestateandhomes-search/Miami_FL" 
     ] 
    def parse(self, response): 
     sites = response.xpath('//li/div/a') # <----- fetches all the <a> tags 
     items = [] 
     for site in sites: 
      print(site.extract()) 
      item = RealtorItem() 
      item['link'] = site.xpath('@href').extract() # <--- extract value from a tag 
      items.append(item) 
     return items 

這裏修復年代items.py文件

from scrapy.item import Item, Field 
class RealtorItem(Item): 
    link = Field() 

風馬牛不相及的建議:這無關你的代碼但是您在scrapy中使用了一些已棄用的函數。您應該通過scrapy tutorial以瞭解如何開始使用新版本的scrapy。

+0

我試着改變代碼,它仍然給我同樣的錯誤:{KeyError:'RealtorItem不支持field:link'}它是我的item.py文件的問題它也有已棄用的功能? –

+0

是的。我將用我有'items.py'文件更新我的代碼。 –

+0

謝謝閣下的幫助 –