scrapy:从xpath选择器中删除元素

时间:2012-08-29 14:06:48

标签: xpath lxml scrapy

我正在使用scrapy来抓取一些具有奇怪格式约定的网站。基本的想法是,我想要一个div的所有文本和子元素,除了一些开头,还有一些在最后。

这是要点。

<div id="easy-id">
  <stuff I don't want>
  text I don't want
  <div id="another-easy-id" more stuff I don't want>

  text I want
  <stuff I want>
  ...
  <more stuff I want>
  text I want
  ...

  <div id="one-more-easy-id" more stuff I *don't* want>
  <more stuff I *don't* want>

注意:缩进意味着关闭标签,所以这里的所有内容都是第一个div的子节点 - 具有id =“easy-id”的节目

因为文本和节点是混合的,所以我无法找到一个简单的xpath选择器来获取我想要的东西。此时,我想知道是否可以将xpath中的结果作为lxml.etree.elementTree检索,然后使用.remove()方法对其进行破解。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

我猜你想要从ID到另一个容易ID的div,但不包括一个更容易的id div。

堆栈溢出没有保留缩进,所以我不知道第一个div元素的结尾在哪里,但是我猜它会在文本之前结束。

在这种情况下你可能想要     // div [@id ='another-easy-id'] / following:node()     [not(preceding :: div [@id ='one-more-easy-id'])而不是(@id ='one-more-easy-id')]

如果这是XHTML,你需要将一些前缀,例如,绑定到XHTML命名空间,并在两个地方使用h:div。

编辑:这是我最后使用的语法。 (见原因的评论。)

//div[@id='easy-id']/div[@id='one-more-easy-id']/preceding-sibling::node()[preceding-sibling::div[@id='another-easy-id']]