【问题标题】:scrapy: Remove elements from an xpath selectorscrapy:从 xpath 选择器中删除元素
【发布时间】:2012-08-24 04:11:35
【问题描述】:

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

有什么建议吗?

【问题讨论】:

  • 你可以使用 lxml 进行解析,但同时 Xpath 也可以工作,如果你告诉我们你想从中获取什么..
  • 查看示例 -- 我已将所有内容标记为“我想要的东西”或“我不想要的东西”
  • 您的缩进是否暗示&lt;/div&gt;&lt;/stuff&gt;&lt;/more&gt; 或者标记与这里的相似?这意味着最终的&lt;more&gt; 嵌套了六层?
  • 如果您粘贴正确的 html 而不是示例会很好,因为在您的场景中不能有通用的 xpath,而是精确的。
  • @stav - 缩进意味着结束标签。这里的一切都是第一个
    的孩子

标签: xpath lxml scrapy


【解决方案1】:

我猜你想要从 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']) 和 not(@id = 'one-more-easy-id')]

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

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

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

【讨论】:

  • 太棒了。 node() 命令是我一直在寻找的——用来检索文本和元素节点的东西。几个小修复:首先,我认为您在“following”和“node()”之间缺少一个冒号。其次,您编写“following”和“preceding”语法的方式不排除属于“one-more-easy-id”子节点的文本节点
  • 是的,有一个错字,你是对的,对不起。很高兴你最终到达那里!
猜你喜欢
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多