Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath 在Scrapy中选择下一个同级的顺序_Xpath_Scrapy - Fatal编程技术网

Xpath 在Scrapy中选择下一个同级的顺序

Xpath 在Scrapy中选择下一个同级的顺序,xpath,scrapy,Xpath,Scrapy,我有以下html要废弃 <h2> <span id="title">Title</span> </h2> <p>Content 1</p> <p>Content 2</p> <p>Content 3</p> <p>Content 4</p> <h2>Some other header</h2> <p>Do not

我有以下html要废弃

<h2>
  <span id="title">Title</span>
</h2>
<p>Content 1</p>
<p>Content 2</p>
<p>Content 3</p>
<p>Content 4</p>
<h2>Some other header</h2>
<p>Do not want this content</p>

标题
内容1

内容2

内容3

内容4

其他一些标题 我不想要这个内容

我要选择的是标题后面的一系列4个标签,一旦遇到非标签,就忽略其他所有内容

到目前为止,我的xpath是
//h2[span[@id='title']]/后面的兄弟::p
,但这也包括不需要的标记


我还尝试了前面的兄弟方法,但没有成功
//p[前面的兄弟::h2[span[@id='title']]]]
。额外的
标签仍然包括在内。

我建议您使用BeautifulSoup

from bs4 import BeautifulSoup
soup =  BeautifulSoup(body, 'html.parser')
p_list = []
for i in soup.find('span' ,{'id':'title'}).parent.next_siblings:
    if i.name=='p':
        p_list.append(i)
print p_list
请尝试以下xpath:

//p[前面的兄弟姐妹::h2[1][./span[@id='title']]]]

此xpath的作用是: 它搜索
p
元素,这些元素具有
h2
元素作为前面的同级元素,但有一个条件-仅当它们的第一个前面的同级元素
h2
有一个名为
span
的子元素,其属性
id
等于
title

为什么它不想要此内容 因为此
p
前面的
h2
s在列出时按顺序出现:

其他一些标题


标题

因此,
h2[1][./span[@id='title']]
结果为false,因此不返回此
p

示例xml的结果如下:

<root>
<h2>
  <span id="title">Title</span>
</h2>
<p>Content 1</p>
<p>Content 2</p>
<p>Content 3</p>
<p>Content 4</p>
<h2>Some other header</h2>
<p>Do not want this content</p>
<p>Do not want this content too</p>
</root>

标题
内容1

内容2

内容3

内容4

其他一些标题 我不想要这个内容

我也不想要这个内容

是:

“内容1

” “内容2

” “内容3

” “内容4


谢谢。这对于更复杂的规则很有用。
'<p>Content 1</p>'
'<p>Content 2</p>'
'<p>Content 3</p>'
'<p>Content 4</p>'