【问题标题】:lxml XPath- filter all text including tailslxml XPath - 过滤所有文本,包括尾部
【发布时间】:2014-01-15 17:40:27
【问题描述】:

我正在尝试使用 lxml 和 Python 从网站中过滤掉文本,但是,格式可能非常不规则。 (这是一个论坛。)

例如,我可能有:

<a>
   <c>
      <d>
         MARKER some text
      </d>
   </c>
   MARKER other text 1
   <b>MARKER other text 2</b>
   M<b>ARKE</b>R <e>other</e> text 3
</a>

我希望我的 xpath 返回我:

MARKER other text 1
<b>MARKER other text 2</b>
M<b>ARKE</b>R <e>other</e> text 3

也就是说,我希望能够解析嵌套文本,同时也能返回带有标记的文本。

我目前拥有的是:

filter = "//text()[not(parent::d[parent::c]) and contains(., 'MARKER')]"
filtered = root.xpath(self.vote_xpath)
for i in filtered:
    print(i)

其中root 是从字符串解析的元素树,它返回我:

MARKER other text 1
MARKER other text 2

这无法返回带有 MARKER 的最后一个文本,并且无法保持我想要的格式。

我应该如何从这里开始?

编辑: 好的,我一直在摆弄 xpath。

//node()[not(parent::d[parent::c]) and contains(., 'MARKER')]

运行:

<a>
   <c>
      <d>
         some text
      </d>
   </c>
   other text 1
   <b>other text 2</b>
   M<b>ARKE</b>R <e>other</e> text 3
</a> 

成功注册了由&lt;b&gt; 标记分解的MARKER,因为node() 将整个节点传递给contains 过滤器。但是,它作为匹配返回整个父节点,在这种情况下,它只是返回整个 &lt;a&gt; 节点及其所有内容。

我应该如何让 xpath 只返回匹配的部分?

【问题讨论】:

    标签: python xpath lxml


    【解决方案1】:

    从不同的角度来看可能会有所帮助。您的半完整解决方案专注于您所需数据的父元素,但您也可以使用子路径标识符或相对路径标识符。

    我得到了这个 XPATH:

    a/c/following-sibling::node()
    

    返回:

       MARKER other text 1
    
    <b>MARKER other text 2</b>
    
    
       M
    <b>ARKE</b>
    
    R 
    <e>other</e>
    
     text 3
    

    虽然这不是您正在寻找的格式,但它是正确的数据,XPATH 并不是真正为格式化您的结果而设计的,因此在那里没有太多可使用的。

    【讨论】:

    • 嗯,这是一种有趣的看待方式。这看起来很实用,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2018-01-02
    • 2015-08-03
    • 1970-01-01
    相关资源
    最近更新 更多