簡體   English   中英

xml文件中的python編碼'(引用)

[英]python encoding ' (quotation) in xml file

我有一個xml文件,沒有指定編碼信息。 我正在嘗試閱讀它並使用以下方法將文件寫入另一個位置

import xml.etree.ElementTree as ET
import pandas as pd
from lxml import etree,html
from lxml.html.clean import Cleaner,clean_html
from xml.sax.saxutils import escape, unescape, quoteattr
with open('check1.xml', 'rb') as file:
        xml_file = file.read()
tree = html.fromstring(xml_file)
tree1 = etree.ElementTree(tree)
tree1.write('path to XML file', pretty_print=True, xml_declaration=True,encoding = 'utf-8')

輸入:

<unit>
 <source>Site name:  Investigation's address</source>
    <target></target>
</unit>

輸出:

<unit>&#13;
 <source>Site name: Investigationâsaddress </source>&#13;
    <target/>&#13;
</unit>&#13;

這些額外的字符為什么顯示出來?為什么'不顯示properly.I試圖Latin-1編碼,但所面臨的類似問題,只是對於'顯示不同的字符。

不要使用open()來讀取XML文件。 這通常是錯誤的做法。

XML解析器有自己的文件處理。 ElementTree也不例外。 使用ET.parse()讀取文件和ET.write() - 或tree.write() - 來編寫它們。

import xml.etree.ElementTree as ET

tree = ET.parse('check1.xml')
tree.write('path to XML file', pretty_print=True, xml_declaration=True, encoding='utf-8')

這個簡單的解析 - 寫周期也可以修復任何混亂的行結尾,因為\\r\\n 不是以XML結尾的正確行 ; 它將始終自動轉換為\\n


背景

幾乎在所有情況下,XML解析器中的文件處理函數都能正確處理文件編碼。 自己打開文件並將其讀入字符串會破壞這種自動處理,即手動執行此操作是一個等待發生的錯誤。

如果XML文件缺少XML聲明( <?xml version="1.0" encoding="..." ?> ),則假定它是UTF-8。 如果由於某種原因這樣的文件實際上不是 UTF-8,那么嚴格來說,它就是打破了。

XML感知工具不會創建此類文件。 如果您有這樣的文件,檢查它們的創建方式並修復該過程應該是您的首要任務。

如果這不是一個選項,嘗試修復這樣一個損壞的文件是將文件讀入字符串並將該字符串提供給XML解析器的唯一情況是正確的解決方案。 但是,這需要事先了解文件編碼,這正是您在使用ET.parse()時無需擔心的事情。

假設該文件在Windows代碼頁1252中 ,錯誤地錯過了XML聲明,並且您希望通過編寫正確編碼的版本來修復它:

import xml.etree.ElementTree as ET

with open('check1.xml', encoding="cp1252") as f:
    tree = ET.fromstring(f.read())

tree.write('path to XML file', pretty_print=True, xml_declaration=True, encoding='utf-8')

除非您處於這種非常特殊的情況,否則請使用ET.parse()來讀取XML文件。

正如DineshSuthar所說,問題在於你的文件行結尾。

當您以二進制模式打開文件時,您無法明確指定應使用哪個換行符......並且解析器會混淆。

如果您知道輸入文件使用的換行符分隔符,則可以使用類似的內容

xml_file = file.read().decode('utf-8').replace("\r\n","\n")

在您的代碼中使其工作。

暫無
暫無

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

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