【问题标题】:Python error: 'utf8' codec can't decode byte 0x92 in position 85: invalid start bytePython 错误:'utf8' 编解码器无法解码位置 85 中的字节 0x92:无效的起始字节
【发布时间】:2012-04-18 14:10:51
【问题描述】:

我正在使用 python2.7 和 lxml。我的代码如下

import urllib
from lxml import html

def get_value(el):
    return get_text(el, 'value') or el.text_content()

response = urllib.urlopen('http://www.edmunds.com/dealerships/Texas/Frisco/DavidMcDavidHondaofFrisco/fullsales-504210667.html').read()
dom = html.fromstring(response)

try:
    description = get_value(dom.xpath("//div[@class='description item vcard']")[0].xpath(".//p[@class='sales-review-paragraph loose-spacing']")[0])
except IndexError, e:
    description = ''

try里面的代码crash,报错

UnicodeDecodeError at /
'utf8' codec can't decode byte 0x92 in position 85: invalid start byte

无法编码/解码的字符串是:不应该

我尝试过使用很多技术,包括 .encode('utf8'),但没有一个能解决问题。我有两个问题:

  1. 如何解决这个问题
  2. 当问题代码在尝试之间时,我的应用程序如何崩溃,除了

【问题讨论】:

  • 发布整个回溯,而不仅仅是最后一行。
  • @Marcin 答案的快照。检查网页的编码对于调试编码错误非常有用。 [![在此处输入图片描述][1]][1] [1]:i.stack.imgur.com/jVHTy.png

标签: python web-scraping lxml


【解决方案1】:

正在使用charset=ISO-8859-1 提供页面。将其解码为 un​​icode。

[

【讨论】:

  • @mangobug 除非您显示包括解码调用在内的实际代码,否则没有人可以帮助您。
【解决方案2】:

您的 except 子句仅处理 IndexError 类型的异常。问题是一个 UnicodeDecodeError,它不是一个 IndexError - 所以这个异常不是由那个 except 子句处理的。

目前还不清楚“get_value”的作用,这很可能是实际问题出现的地方。

【讨论】:

  • 这没什么帮助,因为现在我们只有一个我们不理解的“get_text”函数。而且我们也没有完整的追溯。您需要提供完整的上下文,否则人们只需要猜测问题。
【解决方案3】:
    • 出错时跳过字符,或将其正确解码为 un​​icode。
    • 您只能捕获 IndexError,而不是 UnicodeDecodeError

【讨论】:

    【解决方案4】:
    1. 将响应解码为 un​​icode,在使用 fromhtml 解析之前正确处理错误(错误时忽略)。

    2. 捕获 UnicodeDecodeError 或所有错误。

    【讨论】:

    • 答案不是捕捉所有错误。这就是你在程序中隐藏错误的方式。
    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 2015-02-23
    • 2018-02-10
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多