Python+;lxml:如何找到标记的名称空间?

Python+;lxml:如何找到标记的名称空间?,python,namespaces,lxml,Python,Namespaces,Lxml,我正在用python+lxml处理一些HTML文件。其中一些是用MS Word编辑的,我们有标记,例如写为。IE和Firefox不会将这些MS标记解释为真实的标记,也不会在标记前后显示换行符,这就是原始编辑器格式化文件的方式,例如,nbsp周围没有空格 另一方面,lxml是整洁的,在处理HTML文件之后,我们看到所有的标记都已更改为适当的标记。不幸的是,在整理之后,两个浏览器现在都在所有nbsp的周围显示换行符,这破坏了原始格式 因此,我的想法是浏览所有这些标记,要么删除它们,要么将它们的.te

我正在用python+lxml处理一些HTML文件。其中一些是用MS Word编辑的,我们有
标记,例如写为
。IE和Firefox不会将这些MS标记解释为真实的
标记,也不会在
标记前后显示换行符,这就是原始编辑器格式化文件的方式,例如,nbsp周围没有空格

另一方面,lxml是整洁的,在处理HTML文件之后,我们看到所有的
标记都已更改为适当的
标记。不幸的是,在整理之后,两个浏览器现在都在所有nbsp的周围显示换行符,这破坏了原始格式

因此,我的想法是浏览所有这些
标记,要么删除它们,要么将它们的.text属性添加到parent.text属性,即删除
标记

from lxml import etree
import lxml.html
from StringIO import StringIO

s='<p>somepara</p> <o:p>msoffice_para</o:p>'

parser = lxml.html.HTMLParser()
html=lxml.html.parse( StringIO( s), parser)

for t in html.xpath( "//p"):
     print "tag: " + t.tag + ",  text: '" + t.text + "'"
因此,lxlm从标记标记中删除名称空间名称。有没有办法知道哪个
标记来自哪个名称空间,所以我只删除带有
的标记

谢谢。

来自HTML规范:“”。 因此我认为
lxml.html.HTMLParser
会删除/忽略名称空间

然而,BeautifulSoup解析HTML的方式不同,所以我认为这可能值得一试。如果还安装了BeautifulSoup,则可以将BeautifulSoup解析器与lxml一起使用,如下所示:

import lxml.html.soupparser as soupparser
import lxml.html
import io
s='<p>somepara</p> <o:p>msoffice_para</o:p>'
html=soupparser.parse(io.BytesIO(s)) 
不起作用。但是这个变通方法/黑客

for t in html.xpath('//*[name()="o:p"]'):    
    print "tag: " + t.tag + ",  text: '" + t.text + "'"
屈服

tag: o:p,  text: 'msoffice_para'

如果html实际上格式良好,则可以使用
etree.XMLParser
。否则,请尝试unutbu的答案

for t in html.xpath('//*[name()="o:p"]'):    
    print "tag: " + t.tag + ",  text: '" + t.text + "'"
tag: o:p,  text: 'msoffice_para'