2009-11-29 50 views
0

我的XML文件看起來像這樣提取HTML:的Python:從XML文件

<strings> 
     <string>Bla <b>One &amp; Two</b> Foo</string> 
</strings> 

我想同時保持內部標籤,提取各<串>的內容。也就是說,我想看到下面的Python字符串:u「Bla <b> One & Two </b > Foo」。另外,我想我可以定居在U「布拉<b>一個&兩個</B >富」,然後嘗試更換實體自己。

我目前正在使用lxml,它允許我遍歷嵌套標籤,遺漏不在標籤內的文本,或者在所有文本內容(itertext)上丟失標籤信息。我可能錯過了一些東西。

如果可能,我寧願保留lxml,儘管如果需要的話我可以切換到另一個庫。

回答

3

有可能是有條件的處理由xpath()函數返回的對象有更好的方式,但我不太熟悉lxml知道它是什麼,所以我不得不編寫一個函數來返回節點的文本值。但這就是說,這顯示了一個通用的方法來解決這個問題:

>>> from lxml import etree 
>>> from StringIO import StringIO 
>>> def node_text(n): 
     try: 
      return etree.tostring(n, method='html', with_tail=False) 
     except TypeError: 
      return str(n) 

>>> f = StringIO('<strings><string>This is <b>not</b> how I plan to escape.</string></strings>') 
>>> x = etree.parse(f) 
>>> ''.join(node_text(n) for n in x.xpath('/strings/string/node()')) 
'This is <b>not</b> how I plan to escape.' 
+0

事實證明,不是使用node(),也可以使用child.iterdesndndants(),但是感謝我指出了正確的方向。 – miracle2k 2009-11-29 22:55:28

2

嘗試etree.tostring

outer = etree.tostring(string_elem, method='html') 
inner = re.match("^[^>]+>(.*)<[^<]+$", outer).groups(1)[0] 
+0

我知道tostring實際上,但包括字符串標籤本身。 – miracle2k 2009-11-29 07:52:03

+0

不會那麼難以手動修剪,一個簡單的正則表達式可以工作 – cobbal 2009-11-29 08:02:46

+0

+1,用於找到使用正則表達式處理XML的罕見情況之一,這不是一個可怕的,可怕的想法。 – 2009-11-29 17:50:52

0

不管語言的,相對簡單的XSLT模板會做的伎倆。

類似於將模式定義爲要保留的標記,轉換爲其他文本。

您當然可以使用具有兼容DOM實現的遞歸函數(minidom也許?)和手動處理標籤。

(僞)

def Function(tag): 
    if tag.NodeType = "#text": return tag.innerText 
    text="" 
    if tag.ElementName in allowedTags: 
     text="<%s>"%tag.ElementName 
    text += [Function(subtag) for subtag in tag.childs] 
    if tag.ElementName in allowedTags: 
     text+="</%s>"%tag.ElementName 
    return text 
-1

不使用的解析器,但只是單純的字符串操作

mystring=""" 
<strings> 
     <string>Bla <b>One &amp; Two</b> Foo</string> 
</strings> 
""" 
for s in mystring.split("</string>"): 
    if "<string>" in s: 
     i = s.index("<string>") 
     print s[i+len("<string>"):].replace("&amp;","") 
+0

這個事情不對的做法名單並不短:除其他外,它失敗,如果有一個空的''元素;如果任何''元素包含的屬性,或者在其打開或關閉的標籤,或者任何文本空白節點包含字符實體或CDATA。 – 2009-11-29 18:38:07

+0

你假設太多了!!這是一個壞習慣。 – ghostdog74 2009-11-30 00:09:57