簡體   English   中英

Python + LXML:如何查找標簽的名稱空間?

[英]Python + lxml: how to find the namespace of a tag?

我正在使用python + lxml處理一些HTML文件。 其中一些已經用MS Word編輯過,例如,我們有<p>標記寫為<o:p>&nbsp</o:p> IE和Firefox不會將這些MS標記解釋為真實的<p>標記,並且不會在<o:p>標記之前和之后顯示換行符,這就是原始編輯器格式化文件的方式,例如, NBSP的。

另一方面,lxml很整潔,在處理完HTML文件之后,我們看到所有<o:p>標簽都已更改為正確的<p>標簽。 不幸的是,在整理之后,兩個瀏覽器現在在所有nbsp周圍顯示換行符,這破壞了原始格式。

因此,我的想法是瀏覽所有這些<o:p>標記,然后刪除它們或將其.text屬性添加到父.text屬性,即刪除<o:p>標記標記。

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 + "'"

結果是:

tag: p,  text: 'somepara'
tag: p,  text: 'msoffice_para'

因此,lxlm從標記標記中刪除名稱空間名稱。 有沒有辦法知道哪個<p>標記來自哪個名稱空間,所以我只刪除那些帶有<o:p>標記?

謝謝。

根據HTML規范:“ 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)) 

BeautifulSoup不會刪除名稱空間,但是也不會這樣識別名稱空間。 相反,它只是標記名稱的一部分。

也就是說,

html.xpath('//o:p',namespaces={'o':'foo'})

不起作用。 但是這種解決方法/黑客

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的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM