2017-07-10 78 views
1

我正在編寫爬行列表網頁的Scrapy蜘蛛。該列表項目包含多個屬性,如地址和年份。在Scrapy官方網站上有關於嵌套選擇器的說明:硒嵌套選擇器不能按預期工作

>>> links = response.xpath('//a[contains(@href, "image")]') 
>>> links.extract() 
[u'<a href="image1.html">Name: My image 1 <br><img src="image1_thumb.jpg"></a>', 
u'<a href="image2.html">Name: My image 2 <br><img src="image2_thumb.jpg"></a>', 
u'<a href="image3.html">Name: My image 3 <br><img src="image3_thumb.jpg"></a>', 
u'<a href="image4.html">Name: My image 4 <br><img src="image4_thumb.jpg"></a>', 
u'<a href="image5.html">Name: My image 5 <br><img src="image5_thumb.jpg"></a>'] 

>>> for index, link in enumerate(links): 
...  args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract()) 
...  print 'Link number %d points to url %s and image %s' % args 

Link number 0 points to url [u'image1.html'] and image [u'image1_thumb.jpg'] 
Link number 1 points to url [u'image2.html'] and image [u'image2_thumb.jpg'] 
Link number 2 points to url [u'image3.html'] and image [u'image3_thumb.jpg'] 
Link number 3 points to url [u'image4.html'] and image [u'image4_thumb.jpg'] 
Link number 4 points to url [u'image5.html'] and image [u'image5_thumb.jpg'] 

但是由於我正在爬取一個動態網站。所以我使用了Selenium選擇器。我想第一個獲得該項目列表:

item_selectors=self.selector.xpath("""//div[@class='info-column']""") 

我打印

item_selectors.extract() 

它可以完美運行。

但是,當我試圖讓地址從每個項目的屬性是這樣的:

for item_selector in item_selectors: 

    address_selector=item_selector.xpath("//span[contains(@ng-bind,'::card.buildingData.address')]/text()").extract() 

在每次迭代中,我從整個頁面地址屬性列表。任何想法爲什麼?

回答

2

"//span[contains(@ng-bind,'::card.buildingData.address')]/text()"是您從整個頁面獲取屬性列表的原因。最初的//span部分告訴解析器查看整個頁面,而不是item_selector。 爲item_selector內只是希望將只是一個額外的領先.正確的語法:

address_selector=item_selector.xpath(".//span[contains(@ng-bind,'::card.buildingData.address')]/text()").extract() 
+0

謝謝,它的工作原理。任何想法,我可以找到一個很好的xpath引用。我已經搜索了很多,但很少發現「。」使用說明 – Jimmy

+0

@Jimmy查看[W3學校教程](https://www.w3schools.com/xml/xpath_intro.asp)。 –