Selenium嵌套选择器无法按预期工作

时间:2017-07-10 16:57:42

标签: python selenium web scrapy

我正在编写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()

在每次迭代中,我都有来自整个页面的地址属性列表。知道为什么吗?

1 个答案:

答案 0 :(得分: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()