ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control character

在网页爬虫时,当出现上述问题,原因是一些控制字符(unicode)的问题,因此需要删除控制字符,如下:

def remove_control_characters(html):
    def str_to_int(s, default, base=10):
        if int(s, base) < 0x10000:
            return chr(int(s, base))
        return default
    html = re.sub(u"&#(\d+);?", lambda c: str_to_int(c.group(1), c.group(0)), html)
    html = re.sub(u"&#[xX]([0-9a-fA-F]+);?", lambda c: str_to_int(c.group(1), c.group(0), base=16), html)
    html = re.sub(u"[\x00-\x08\x0b\x0e-\x1f\x7f]", "", html)
    return html

 

`ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters` 这一错误提示通常出现在处理XML相关的程序里,表示字符串中含有不符合XML规范的字符。例如空字节(`\x00`)或者一些控制字符等特殊编码信息破坏了标准的数据传输规则。 ### 导致此问题的主要情况包括: 1. **源数据污染**: 当从前端接收未经验证的输入、文件读取过程中包含了非法字符、数据库查询结果包含二进制字段等情况都可能导致传入到生成器函数中的部分值存在问题; 2. **转义机制缺失**: 在将普通文本转化为适合嵌套于标签之间的合法子串前未做适当替换工作; 3. **版本差异带来的限制变化**: 特定解析库可能对允许使用的字符集范围做出更严格的约束从而暴露隐藏已久的潜伏缺陷。 --- ### 解决方案建议: #### 方案一:清理源头 尽可能保证进入系统的所有外部资料均满足基础质量要求——仅限可打印ASCII区间内有效字符,并且避免任何形式不可预见空白符混杂其中。 ```python def clean_string(s): return ''.join(c for c in s if 31 < ord(c) < 127) clean_data = [clean_string(item) for item in raw_input_list] ``` #### 方案二:利用现有工具预处理 很多专门针对某种格式设计而成的专业模块自带过滤选项可以帮助我们轻松完成任务。比如lxml提供了一个resolve_entities标志位用于忽略潜在风险项: ```python from lxml import etree tree = etree.parse('file.xml', parser=etree.XMLParser(resolve_entities=False)) ``` 此外还可以借助BeautifulSoup这类友好的网页抓包利器自动调整不合规格处: ```python soup = BeautifulSoup(dirty_html_content,"html.parser") fixed_output=soup.prettify() ``` #### 方案三:手动排除干扰因素 如果明确知道哪些具体符号会触发冲突则可以直接通过正则表达式等方式将其逐一去除掉即可解决问题。 ```python import re pattern = r'[^\u0020-\uD7FF\uE000-\uFFFD]' safe_text=re.sub(pattern,' ',original_str) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值