lxml:我无法删除span标签和里面的文本

时间:2015-06-12 10:39:36

标签: html lxml

我有一个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)。

2 个答案:

答案 0 :(得分: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>'

答案 1 :(得分:0)

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

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