[英]lxml: Do not parse subtree but treat as binary content
我正在處理包含元素的 XML 內容,這些元素可能將格式錯誤的 XML/類似標記(例如 HTML)的內容保存為文本。 例如:
<root>
<data>
<x>foo<y>bar</y>
</data>
<data>
<z>foo<y>bar</y>
</data>
</root>
目標:我希望lxml.etree
不嘗試將data
元素下的任何內容解析為 XML,而是簡單地將其作為bytes
或str
(可以在elem.text
)返回。
文件很大,我想使用lxml.etree.iterparse
來提取data
元素中的內容。
最初的想法:獲取元素內容(在本例中包含data
開始和結束標簽)的直接方法可能是:
data = BytesIO(b"""
<root>
<data>
<x>foo<y>bar</y>
</data>
<data>
<z>foo<y>bar</y>
</data>
</root>
""")
from lxml import etree
# see below why html=True
context = etree.iterparse(data, events=("end",), tag=("data",), html=True)
contents = [] # I don't keep lists in the "real" application
for event, elem in context:
contents.append(etree.tostring(elem)) # get back the full content underneath data
這樣做的問題是lxml.etree
可能會遇到解析data
子項的問題(例如:當html
-data 存儲在data
下時,我已經不得不使用html=True
來避免遇到問題)。 我知道lxml
中有自定義元素類,但從我對文檔的理解lxml.etree
,它們不會改變lxml.etree
由libxml2
決定的解析行為)。
有什么簡單的方法可以告訴lxml
不要嘗試將元素內容解析為子元素。 應用程序本身受益於其他lxml
功能,如果我單獨為data
編寫自定義提取器,我將不得不復制這些功能。
或者有沒有辦法使用 XSLT 首先轉換輸入以在lxml
進行處理,然后再鏈接回數據?
這是否按預期工作? 通過添加 DTD 和 CDATA 來修改 XML,以指定必須將數據元素內的內容視為字符數據。
data = io.BytesIO(B'''<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE root [
<!ELEMENT root (data+)>
<!ELEMENT data (#PCDATA)>
]>
<root>
<data>
<![CDATA[
<x>foo<y>bar</y>
]]>
</data>
<data>
<![CDATA[
<z>foo<y>bar</y>
]]>
</data>
</root>
''')
from lxml import etree
# see below why html=True
context = etree.iterparse(data, events=("end",), tag=("data",), dtd_validation=True, load_dtd=True)
contents = [] # I don't keep lists in the "real" application
for event, elem in context:
contents.append(etree.tostring(elem)) # get back the full content underneath data
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.