笨鸟编程-零基础入门Pyhton教程

 找回密码
 立即注册

选择器

发布者: 笨鸟自学网



使用xpaths

下面是一些提示,可以帮助您有效地将xpath与scrapy选择器结合使用。如果您还不太熟悉xpath,可以先看看这个 XPath tutorial .

注解

其中一些技巧是基于 this post from Zyte's blog 。

使用相对路径

请记住,如果要嵌套选择器并使用以开头的xpath / ,该xpath对文档是绝对的,而不是相对于 Selector 你是从打电话来的。

例如,假设您希望提取所有 <p> 内部元素 <div> 元素。首先,你会得到所有 <div> 元素:

>>> divs = response.xpath('//div')

首先,您可能会尝试使用以下方法,这是错误的,因为它实际上提取了所有 <p> 文档中的元素,而不仅仅是其中的元素 <div> 元素:

>>> for p in divs.xpath('//p'):  # this is wrong - gets all <p> from the whole document
...     print(p.get())

这是正确的方法(注意在 .//p XPath):

>>> for p in divs.xpath('.//p'):  # extracts all <p> inside
...     print(p.get())

另一个常见的情况是提取所有直接 <p> 儿童:

>>> for p in divs.xpath('p'):
...     print(p.get())

有关相对路径的更多详细信息,请参见 Location Paths XPath规范中的节。

按类查询时,请考虑使用CSS

因为一个元素可以包含多个CSS类,所以按类选择元素的xpath方法相当冗长:

*[contains(concat(' ', normalize-space(@class), ' '), ' someclass ')]

如果你使用 @class='someclass' 如果只使用 contains(@class, 'someclass') 为了弥补这一点,如果元素具有共享字符串的不同类名,那么最终可能会得到更多想要的元素。 someclass .

事实证明,剪贴选择器允许您链接选择器,因此大多数时候,您都可以使用CSS按类选择,然后在需要时切换到XPath:

>>> from scrapy import Selector
>>> sel = Selector(text='<div class="hero shout"><time datetime="2014-07-23 19:00">Special date</time></div>')
>>> sel.css('.shout').xpath('./time/@datetime').getall()
['2014-07-23 19:00']

这比使用上面显示的详细的xpath技巧要干净。只要记住使用 . 在后面的xpath表达式中。


上一篇:蜘蛛下一篇:项目

Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )

GMT+8, 2024-12-4 15:56 , Processed in 0.015878 second(s), 17 queries .

© 2001-2020

返回顶部