我正在使用Python中的SAX解析XML文件。通过urllib.request从HTTP流中读取XML。
但是,XML流似乎包含无效字符。具体来说,当从UTF-8解码并将其转储到文件时,似乎我得到了一堆“ 8000”的实例,这些实例在换行符之前和之后。 这会导致SAX解析失败。
我的问题是双重的:
[编辑]
我无法共享源数据,但这是前几个字符,如字符串和十六进制。前一个字符是令人反感的“ 8000”字符。
字符串:
8000<?xml
十六进制:
38:30:30:30:3c:3f:78:6d:6c:20
可以搜索'8000'字符串,但这不是一个很好的解决方案,因为数据可能包含该字符串。
答案 0 :(得分:0)
<?xml
是XML declaration的开头。
一个XML文档中最多只能有一个XML声明,并且它只能作为文件中的第一件事出现。对于前面的“ 8000”,它将呈现XML文档,而不是 well-formed 。在尝试将此流解析为XML之前,必须确保不超过一个XML声明并且在它之前没有任何内容。这必须在字符/字符串/文本级别上完成,而不是在XML级别上完成。
另请参见 Error: The processing instruction target matching "[xX][mM][lL]" is not allowed
答案 1 :(得分:0)
似乎代码从urllib.request.urlopen发送的HTTPResponse(即HTTPResponse.fp)向XML解析器提供了文件解析器对象,而不仅仅是HTTPResponse。由于某种原因,这导致将端口(8000)写入BufferedReader的每个缓冲块中。 看来这是由于从Python 2迁移到3引起的(也许HTTPResponse对象在Python 2中的行为有所不同)。
通过直接使用HTTPResponse而不是response.fp向XML解析器提供数据,该端口从字节流中删除,并且不存在进一步的编码问题。