我正在使用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()方法对其进行破解。
有什么建议吗?
答案 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']]