我一直在玩scrapy,我发现xpath的知识对于成功利用scrapy至关重要。我有一个网页,我正在尝试从标签格式化的地方收集一些信息
<div id = "content">
<h1></h1>
<p></p>
<p></p>
<h1></h1>
<p></p>
<p></p>
现在标题包含一个标题,第一个'p'包含data1,第二个'p'包含data2。这似乎是一个非常直接的任务,如果总是如此,我就没有问题,即hsx.select('//*[@id="content"]')
等等。
问题是,有时在标题后面只有一个p标记而不是两个。
<div id = "content">
<h1></h1>
<p></p> (a)
<h1></h1>
<p></p> (b)
<p></p> (c)
我想要的是如果缺少段落标记我想将该信息存储为我的列表中的空白数据。现在发生的事情是列表存储第一个标题1,第一个段落标记(a),然后是第二个h1(b)下面的段落标记。 它应该做的是存储
title -> h1[0]
data1[0] -> (a)
data2[0] ->[]
我希望这是有道理的。我一直在寻找一个好的xpath或scrapy解决方案来做到这一点,但我似乎无法找到一个。任何有用的提示都会很棒。感谢
答案 0 :(得分:0)
使用强>:
//div[@id='content']
/h1[1]/following sibling::*
[not(position()>2)][self::p]
这会选择(最多)两个直接同胞元素,只有它们是p
,才能选择任何h1
的第一个div
子元素(我们知道这必须只有一个div) the string value of whose
{1}} ID为attribute is
“内容”`。
如果只有第一个直接兄弟是p
,那么返回的节点列表只包含一个项目。
您可以检查返回的节点列表的长度是1还是2,并使用它来构建对处理的控制。
答案 1 :(得分:0)
我想你想要这样的东西;不是100%虽然/未经测试。
//h1/following-sibling::*[2][self::p]/text()|//h1[not(following-sibling::*[2][self::p])]/string('')