Scrapy中的嵌套选择器

4
我在使用Scrapy时遇到了问题,无法像文档中描述的那样使嵌套选择器正常工作(http://doc.scrapy.org/en/latest/topics/selectors.html)。
以下是我的代码:
sel = Selector(response)
level3fields = sel.xpath('//ul/something/*')

for element in level3fields:
    site = element.xpath('/span').extract()

在循环中打印出“element”时,我得到了< Selector xpath='stuff seen above' data="u'< span class="something">text< /span>>
现在我有两个问题:
  1. 首先,在element中,也应该有一个a-node(如<a href),但它没有显示在打印输出中,只有当我直接提取它时才会显示。这只是一个打印错误,还是“element-Selector”不包含a-node(未经提取)?
  2. 当我打印上面的"site"时,它应该显示一个包含span-nodes的列表。但是,它并没有,它只打印出一个空列表。
我尝试了多种更改(在不同的位置使用多个斜杠和星号(*)),但没有任何一种方法使我更接近解决问题。
基本上,我只想获得一个嵌套的Selector,它可以在第二步(循环)中给我span-node。
有人有什么提示吗?
1个回答

10
关于你的第一个问题,这只是一个打印“错误”。`Selector`类的`__repr__`和`__str__`方法仅打印数据的前40个字符(表示为HTML/XML或文本内容)。参见:https://github.com/scrapy/scrapy/blob/master/scrapy/selector/unified.py#L143 在循环`level3fields`时,请使用相对XPath表达式。使用`/span`将查找根节点直接下面的`span`元素,我猜这不是你想要的。
尝试这个:
sel = Selector(response)
level3fields = sel.xpath('//ul/something')

for element in level3fields:
    site = element.xpath('.//span').extract()

2
太棒了!非常感谢,这解决了我的问题。我认为主要问题是忘记了点(“.”),这表示我必须引用当前节点。 - munzwurf
1
是的,我倾向于在所有我的XPath前面加上一个“.”以确保安全。 - paul trmbrth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接