【问题标题】:lxml: I can't remove a span tag and the text insidelxml:我无法删除跨度标签和里面的文本
【发布时间】:2015-06-12 10:39:36
【问题描述】:

我有一个 html 文件,其中包含一些像这样的 div(非常简化):

<div num="1" class="class1">
  <div class="class1-text">
    <span class="class2">
      <span class="class3"> some chinese text </span>
      some english text
    </span>
  </div>
</div>

我正在尝试通过使用 lxml 删除包含它的 span 节点来删除所有中文文本:

parser = et.XMLParser(remove_blank_text=True, recover=True)
documentXml=et.parse(html_FileName, parser)
for class1Node in documentXml.xpath('//div[@class="class1-text"]'):
    chineseNode=class1Node.xpath('.//span[@class="class3"]')
    chineseNode.getparent().remove(chineseNode)

但是我不是从 xpath 中获取 span class3 节点,而是得到 span class2,因此我最终删除了所有内容(甚至是英文文本)。

如果我不使用 lxml 解析,则会出现解析错误(可能是汉字问题或 html 错误)。

【问题讨论】:

    标签: html lxml


    【解决方案1】:

    你可以试试strip_elements()函数,比如:

    from lxml import etree as et
    
    parser = et.XMLParser(remove_blank_text=True, recover=True)
    documentXml=et.parse(html_FileName, parser)
    for class1Node in documentXml.xpath('//div[@class="class1-text"]'):
        chineseNode=class1Node.xpath('.//span[@class="class3"]')
        et.strip_elements(chineseNode[0].getparent(), 'span', with_tail=False)
    
    print(et.tostring(documentXml))
    

    它产生:

    b'<div num="1" class="class1"><div class="class1-text"><span class="class2">\n      some english text\n    </span></div></div>'
    

    【讨论】:

      【解决方案2】:

      您应该能够将您的 xpath 选择器简化为:

      for chineseNode in documentXml.xpath("//div[@class='class1-text']//span[@class='class3']"):
          chineseNode.getparent().remove(chineseNode)
      

      【讨论】:

        猜你喜欢
        • 2018-08-15
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        • 2019-10-22
        • 2014-08-31
        • 2013-11-15
        • 1970-01-01
        相关资源
        最近更新 更多