Scrapy – Xpath技巧
在一个条件中使用文本节点
当你在XPath字符串函数中使用文本节点时,使用 .(dot) 而不是使用 .//text() ,因为这将产生称为 节点集 的文本元素的集合 。
例如 –
from scrapy import Selector
val = Selector(text = '<a href = "#">More Info<strong>click here</strong></a>')
如果你要将一个节点集转换为一个字符串,那么请使用以下格式 –
>>val.xpath('//a//text()').extract()
它将显示元素为-
[u'More Info',u'click here']
和
>>val.xpath("string('//a[1]//text())").extract()
它的结果是元素为-
[u'More Info']
//node[1]和(//node)[1]之间的区别
//node[1] 显示所有定义在各自父类下的第一个元素。 (//node)[1] 只显示文档中的第一个元素。
例如 –
from scrapy import Selector
val = Selector(text = """
<ul class = "list">
<li>one</li>
<li>one</li>
<li>one</li>
</ul>
<ul class = "list">
<li>four</li>
<li>five</li>
<li>six</li>
</ul>""")
res = lambda x: val.xpath(x).extract()
下面一行显示了所有定义在各自父级下的第一个 li 元素–
>>res("//li[1]")
它将显示结果为–
[u'<li>one</li>', u'<li>four</li>']
你可以得到如下所示的完整文件的第一个 li 元素
>>res("(//li)[1]")
它将显示结果为–
[u'<li>one</li>']
你也可以显示所有定义在 ul 父级下的第一个 li 元素-
>>res("//ul//li[1]")
它将显示结果为–
[u'<li>one</li>', u'<li>four</li>']
你可以得到整个文档中定义在 ul 父级下的第一个 li 元素,如下所示
>>res("(//ul//li)[1]")
它将显示结果为–
[u'<li>one</li>']
内置选择器参考
内置的选择器包括以下类别 −
class scrapy.selector.Selector(response = None, text = None, type = None)
上述类包含以下参数 –
- response – 它是一个HTMLResponse和XMLResponse,选择和提取数据。
-
text – 它使用UTF-8字符编码对所有字符进行编码,当没有响应的时候。
-
type – 它指定了不同的选择器类型,比如html用于HTML响应,xml用于XMLResponse类型,none用于默认类型。它根据响应类型选择类型,或者默认设置为html,如果它与文本一起使用。
内置的选择器包含以下方法 −
序号 | 方法和描述 |
---|---|
1 | xpath(query) 它根据xpath查询匹配节点,并将结果作为SelectorList实例提供。参数query指定了要使用的XPATH查询。 |
2 | css(query) 它提供CSS选择器并返回SelectorList实例。参数query指定了要使用的CSS选择器。 |
3 | extract() 它把所有匹配的节点作为一个unicode字符串的列表带出来。 |
4 | re(regex) 它提供正则表达式,并将匹配的节点作为一个单字节字符串的列表带出。参数regex可以作为正则表达式或字符串,使用re.compile(regex)方法将其编译为正则表达式。 |
5 | register_namespace(prefix, uri) 它指定了选择器中使用的命名空间。如果不从非标准名称空间中注册名称空间,你就不能提取数据。 |
6 | remove_namespaces() 它抛弃了命名空间,并允许使用无命名空间的xpaths来遍历文档。 |
7 | __nonzero__() 如果内容被选中,那么这个方法返回 true,否则返回 false。 |
选择器列表对象
class scrapy.selector.SelectorList
选择器列表对象包含以下方法-
序号 | 方法和描述 |
---|---|
1 | xpath(query) 它对元素使用.xpath()方法,并将结果作为SelectorList实例提供。参数query指定了Selector.xpath()方法中定义的参数。 |
2 | css(query) 它对元素使用.css()方法,并将结果作为SelectorList实例给出。参数query指定了Selector.css()方法中定义的参数。 |
3 | extract() 它使用.extract()方法带出列表中的所有元素,并将结果作为一个unicode字符串的列表返回。 |
4 | re() 它对元素使用.re()方法,并将元素带出,作为一个unicode字符串的列表。 |
5 | __nonzero__() 如果列表不是空的,那么该方法返回 true,否则返回 false。 |