如何使用scrapy选择下一个节点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用scrapy选择下一个节点相关的知识,希望对你有一定的参考价值。

我有html看起来像这样:

<h1>Text 1</h1>
<div>Some info</div>
<h1>Text 2</h1>
<div>...</div>

我理解如何使用h1中的scrapy信息提取:

content.select("//h1[contains(text(),'Text 1')]/text()").extract()

但我的目标是从<div>Some info</div>中提取内容

我的问题是我没有关于div的任何具体信息。所有我所知道的,它正好在<h1>Text 1</h1>之后。我可以使用选择器在树中获取NEXT元素吗?元素,位于DOM树中的同一级别?

就像是:

a = content.select("//h1[contains(text(),'Text 1')]/text()")
a.next("//div/text()").extract()
Some info
答案

试试这个xpath

//h1[contains(text(), 'Text 1')]/following-sibling::div[1]/text()
另一答案

使用following-sibling。来自https://www.w3.org/TR/2017/REC-xpath-31-20170321/

以下兄弟轴包含上下文节点的以下兄弟节点,上下文节点的父节点的子节点按文档顺序出现在上下文节点之后;

例:

from scrapy.selector import Selector
text = '''
<h1>Text 1</h1>
<div>Some info</div>
<h1>Text 2</h1>
<div>...</div>
'''
sel = Selector(text=text)
h1s = sel.xpath('//h1/text()')
for counter, h1 in enumerate(h1s,1):
    div = sel.xpath('(//h1)[{}]/following-sibling::div[1]/text()'.format(counter))
    print(h1.get())
    print(div.get())

输出是:

Text 1
Some info
Text 2
...

以上是关于如何使用scrapy选择下一个节点的主要内容,如果未能解决你的问题,请参考以下文章

如何使用scrapy Selector获取节点的innerHTML?

scrapy按顺序启动多个爬虫代码片段(python3)

scrapy主动退出爬虫的代码片段(python3)

scrapy知识补充--scrapy shell 及Spider

如果它是使用 XPath 在 Scrapy 中的其他节点的父节点,如何从子节点获取文本

scrapy选择器归纳