1

我正在使用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() 方法对其进行破解。

有什么建议么?

4

1 回答 1

3

我猜你想要从 ID 为 another-easy-id 的 div 到但不包括 one-more-easy-id div 的所有内容。

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

在这种情况下,您可能需要 //div[@id = 'another-easy-id']/following:node() [not(preceding::div[@id = 'one-more-easy-id']) 和不是(@id = '一个更简单的 ID')]

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

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

//div[@id='easy-id']/div[@id='one-more-easy-id']/preceding-sibling::node()[preceding-sibling::div[@id='another-easy-id']]
于 2012-08-30T03:26:37.443 回答