2009-07-06 36 views
4

我正在使用ElementTree來解析XML文件。在某些領域,會有HTML數據。例如,考慮如下聲明:使用ElementTree的節點內部的HTML

<Course> 
    <Description>Line 1<br />Line 2</Description> 
</Course> 

現在,假設_course是一個元素變量,它包含這個Couse元素。我想訪問本課程的描述,所以我這麼做:

desc = _course.find("Description").text; 

但是然後desc只包含「Line 1」。我讀了一些關於.tail屬性的內容,所以我也試過:

desc = _course.find("Description").tail; 

而且我得到相同的輸出。我應該怎麼做才能使desc成爲「Line 1
Line 2」(或字面意義上的任何事物)?換句話說,我正在尋找類似於C#中的.innerText屬性(以及其他許多語言)。

回答

3

你有任何控制xml文件的創建嗎?應該對包含xml標記(或類似標記)或標記字符('<'等)的xml標記的內容進行編碼以避免此問題。你可以做這一點:

  • 一個CDATA部分
  • Base64編碼或一些其它的編碼(不包括XML保留字符)
  • 實體編碼( '< '==' &lt;')

如果您不能進行這些更改,並且ElementTree不能忽略xml模式中未包含的標籤,那麼您將不得不預先處理該文件。當然,如果模式與html重疊,那麼你運氣不好。

+0

使用CDATA部分解決了這個問題。謝謝! – 2009-07-06 18:30:10

1

像「<」和「&」這樣的字符在XML元素中是非法的。

「<」將產生錯誤,因爲解析器將其解釋爲新元素的開始。

「&」將產生錯誤,因爲解析器將其解釋爲字符實體的開始。

某些文本(如JavaScript代碼)包含大量「<」或「&」字符。爲了避免錯誤,腳本代碼可以定義爲CDATA。

解析器忽略CDATA部分內的所有內容。

一個CDATA部件以 「」 開頭:

更多信息:http://www.w3schools.com/xmL/xml_cdata.asp

希望這有助於!

3

您正試圖從錯誤的元素中讀取尾部屬性。嘗試

desc = _course.find("br").tail; 

當閱讀混合內容XML文件時,tail屬性用於存儲尾隨文本節點;一個元件之後直接如下文本被存儲在該元素的屬性尾:

 
    <tag><elem>this goes into elem's 
    text attribute</elem>this goes into 
    elem's tail attribute</tag> 

簡單代碼段打印文本和尾部從XML/XHTML所有元素的屬性。

 
import xml.etree.ElementTree as ET 

def processElem(elem): 
    if elem.text is not None: 
     print elem.text 
    for child in elem: 
     processElem(child) 
     if child.tail is not None: 
      print child.tail 

xml = '''<Course> 
    <Description>Line 1<br />Line 2 <span>child text </span>child tail</Description> 
    </Course>''' 

root = ET.fromstring(xml) 
processElem(root) 

輸出:

 
Line 1 
Line 2 
child text 
child tail 

一個更好的解決方案見http://code.activestate.com/recipes/498286-elementtree-text-helper/。它可以修改以適應。

P.S.我改變了我的名字從user839338引用在下一篇文章

+0

我很難看到我在這種情況下使用的解決方案作爲解決方法。對Description屬性的內容進行編碼僅僅意味着屬性內容中包含的任何語義都不在主XML樹所描述的語義範圍之內。 – 2011-07-15 13:46:04

1

user839338's answer的啓發,我沒有找到一個合理的解決方案,看起來有點像這樣。

>>> from xml.etree import ElementTree as etree 
>>> corpus = '''<Course> 
...  <Description>Line 1<br />Line 2</Description> 
... </Course>''' 
>>> 
>>> doc = etree.fromstring(corpus) 
>>> desc = doc.find("Description") 
>>> desc.tag = 'html' 
>>> etree.tostring(desc) 
'<html>Line 1<br/>Line 2</html>\n' 
>>> 

有消除周圍的標籤(原<Description>)沒有簡單的方法,但它很容易修改到的東西,可以根據需要使用,例如<div><span>

相關問題