从XML流中删除无效字符

时间:2018-10-18 09:15:04

标签: xml python-3.x sax

我正在使用Python中的SAX解析XML文件。通过urllib.request从HTTP流中读取XML。

但是,XML流似乎包含无效字符。具体来说,当从UTF-8解码并将其转储到文件时,似乎我得到了一堆“ 8000”的实例,这些实例在换行符之前和之后。 这会导致SAX解析失败。

我的问题是双重的:

  1. 我如何删除或忽略urllib.request数据流中出现的无效字符?
  2. “ 8000”可能是什么,并且该问题是否有更具体的解决方法?

[编辑]

我无法共享源数据,但这是前几个字符,如字符串和十六进制。前一个字符是令人反感的“ 8000”字符。

字符串:

8000<?xml

十六进制:

38:30:30:30:3c:3f:78:6d:6c:20

可以搜索'8000'字符串,但这不是一个很好的解决方案,因为数据可能包含该字符串。

2 个答案:

答案 0 :(得分:0)

<?xmlXML 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解析器提供数据,该端口从字节流中删除,并且不存在进一步的编码问题。