Scrapy中的嵌套选择器
我在使用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='上面看到的内容' data="u'< span class="something">text< /span>>
现在我遇到了两个问题:
首先,在这个元素里面,应该还有一个“a”节点(像
<a href
),但是在打印的结果中没有显示出来,只有直接提取时才会出现。这是打印错误,还是说这个“element-Selector”没有包含a节点(不经过提取)呢?当我打印上面的“site”时,它应该显示一个包含span节点的列表。然而,它并没有,只打印出一个空列表。
我尝试了多种组合的修改(在不同地方加了多个斜杠和星号*),但都没有让我更接近解决方案。
总的来说,我只是想得到一个嵌套选择器,以便在第二步(循环中)获取span节点。
有没有人能给我一些建议?
1 个回答
10
关于你第一个问题,这只是一个打印“错误”的信息。__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()