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

 找回密码
 立即注册

选择器

发布者: 笨鸟自学网



xpath表达式中的变量

xpath允许您引用xpath表达式中的变量,使用 $somevariable 语法。这与SQL世界中的参数化查询或准备好的语句有点类似,在SQL世界中,将查询中的某些参数替换为诸如 ? ,然后用查询传递的值替换。

下面是一个基于元素“id”属性值匹配元素的示例,而不必对其进行硬编码(如前所示):

>>> # `$val` used in the expression, a `val` argument needs to be passed
>>> response.xpath('//div[@id=$val]/a/text()', val='images').get()
'Name: My image 1 '

下面是另一个示例,用于查找 <div> 包含五个的标签 <a> 孩子们(在这里我们传递价值 5 整数形式):

>>> response.xpath('//div[count(a)=$cnt]/@id', cnt=5).get()
'images'

调用时,所有变量引用都必须具有绑定值 .xpath() (否则你会得到 ValueError: XPath error: 例外)。这是通过根据需要传递尽可能多的命名参数来实现的。

parsel _为scrappy选择器供电的库提供了更多的细节和示例 XPath variables .

正在删除命名空间

在处理 爬取 项目时,完全消除名称空间,只使用元素名,编写更简单/方便的xpaths通常是非常方便的。你可以使用 Selector.remove_namespaces() 方法。

让我们展示一个例子,用Python Insider博客Atom feed来说明这一点。

首先,我们用要抓取的URL打开外壳:

$ scrapy shell https://feeds.feedburner.com/PythonInsider

文件就是这样开始的:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet ...
<feed xmlns="http://www.w3.org/2005/Atom"
      xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"
      xmlns:blogger="http://schemas.google.com/blogger/2008"
      xmlns:georss="http://www.georss.org/georss"
      xmlns:gd="http://schemas.google.com/g/2005"
      xmlns:thr="http://purl.org/syndication/thread/1.0"
      xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  ...

您可以看到几个名称空间声明,其中包括默认的“http://www.w3.org/2005/atom”,以及另一个使用“gd:”前缀的“http://schemas.google.com/g/2005”。

一旦进入外壳,我们可以尝试选择所有 <link> 对象并查看它是否不起作用(因为Atom XML命名空间混淆了这些节点):

>>> response.xpath("//link")
[]

但一旦我们呼叫 Selector.remove_namespaces() 方法,则所有节点都可以通过其名称直接访问:

>>> response.selector.remove_namespaces()
>>> response.xpath("//link")
[<Selector xpath='//link' data='<link rel="alternate" type="text/html" h'>,
    <Selector xpath='//link' data='<link rel="next" type="application/atom+'>,
    ...

如果您想知道为什么不总是在默认情况下调用命名空间移除过程,而不必手动调用它,这是因为两个原因,按照相关性的顺序,这是:

  1. 删除命名空间需要迭代和修改文档中的所有节点,这是一个相当昂贵的操作,默认情况下,对scrapy所爬行的所有文档执行此操作。

  2. 在某些情况下,实际需要使用名称空间,以防某些元素名称在名称空间之间发生冲突。不过,这些病例非常罕见。


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

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

GMT+8, 2024-12-4 16:05 , Processed in 0.019275 second(s), 17 queries .

© 2001-2020

返回顶部