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

 找回密码
 立即注册

选择器

发布者: 笨鸟自学网



注意//节点之间的区别 [1] 和(/ /节点) [1]

//node[1] 选择所有首先出现在各自父节点下的节点。

(//node)[1] 选择文档中的所有节点,然后只获取其中的第一个节点。

例子:

>>> from scrapy import Selector
>>> sel = Selector(text="""
....:     <ul class="list">
....:         <li>1</li>
....:         <li>2</li>
....:         <li>3</li>
....:     </ul>
....:     <ul class="list">
....:         <li>4</li>
....:         <li>5</li>
....:         <li>6</li>
....:     </ul>""")
>>> xp = lambda x: sel.xpath(x).getall()

这是最重要的 <li> 任何父元素下的元素:

>>> xp("//li[1]")
['<li>1</li>', '<li>4</li>']

这是第一个 <li> 整个文档中的元素:

>>> xp("(//li)[1]")
['<li>1</li>']

这是最重要的 <li> 下的元素 <ul> 起源:

>>> xp("//ul/li[1]")
['<li>1</li>', '<li>4</li>']

这是第一个 <li> 元素在 <ul> 整个文档中的父级:

>>> xp("(//ul/li)[1]")
['<li>1</li>']

在条件中使用文本节点

当需要将文本内容用作 XPath string function 避免使用 .//text() and use just . 相反。

这是因为表达式 .//text() 生成一个文本元素集合--a node-set . 当一个节点集被转换成一个字符串时,当它作为参数传递给一个字符串函数(如 contains() 或 starts-with() ,它只为第一个元素生成文本。

例子:

>>> from scrapy import Selector
>>> sel = Selector(text='<a href="#">Click here to go to the <strong>Next Page</strong></a>')

转换A node-set 字符串:

>>> sel.xpath('//a//text()').getall() # take a peek at the node-set
['Click here to go to the ', 'Next Page']
>>> sel.xpath("string(//a[1]//text())").getall() # convert it to string
['Click here to go to the ']

node 但是,转换为字符串后,会将其自身的文本加上其所有后代的文本组合在一起:

>>> sel.xpath("//a[1]").getall() # select the first node
['<a href="#">Click here to go to the <strong>Next Page</strong></a>']
>>> sel.xpath("string(//a[1])").getall() # convert it to string
['Click here to go to the Next Page']

所以,使用 .//text() 在这种情况下,节点集不会选择任何内容:

>>> sel.xpath("//a[contains(.//text(), 'Next Page')]").getall()
[]

但是使用 . 指的是节点:

>>> sel.xpath("//a[contains(., 'Next Page')]").getall()
['<a href="#">Click here to go to the <strong>Next Page</strong></a>'] 

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

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

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

© 2001-2020

返回顶部