1

我一直在玩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 解决方案来做到这一点,但我似乎找不到。任何有用的提示都会很棒。谢谢

4

2 回答 2

0

使用

//div[@id='content']
     /h1[1]/following sibling::*
             [not(position()>2)][self::p]

这将选择(最多)两个直接兄弟元素,前提是它们是anyp的第一h1个子元素div(我们知道这必须只是一个div) the string value of whoseid attribute is"content"`。

如果只有第一个直接兄弟是 a p,则返回的节点列表仅包含一个项目。

您可以检查返回的节点列表的长度是 1 还是 2,并使用它来构建对您的处理的控制。

于 2012-10-20T01:55:15.403 回答
0

我想你会想要这样的东西;虽然不是 100% / 未经测试。

//h1/following-sibling::*[2][self::p]/text()|//h1[not(following-sibling::*[2][self::p])]/string('')
于 2012-10-20T01:55:41.087 回答