Python Mechanize - unescape_charref()不能处理十六进制代码

时间:2012-07-12 12:13:02

标签: python escaping mechanize

我在Mechanize中遇到了一个有趣的错误,我不确定将其作为错误提交,或者需要寻找解决方法。

打开一个(错误地?)包含带有十六进制代码的转义字符的页面会导致ValueError。以下代码重现错误:

import mechanize
b = mechanize.Browser()
gr = 'http://www.goodreads.com/'
b.open(gr + 'book/show/613791.Santuario_De_La_Pen_X303_A_De_Francia')

经过长时间的追溯,报告了以下内容:

File "C:\Python27\lib\site-packages\mechanize\_html.py", line 317, in unescape_charref
  uc = unichr(int(name, base))
ValueError: invalid literal for int() with base 10: 'X303'

我想这是由unescape_charref()引起的二进制字符代码(例如#771)引起的,其中此页面使用十六进制代码#X303。有没有办法让Mechanize正确处理这个问题?

在这种情况下,我实际上并不太关心正确的unescaping,因为我只想从这些页面的head元素中检索一个URL。我想捕获ValueError并继续获取响应。不幸的是,Mechanize无法处理此问题并返回无。

1 个答案:

答案 0 :(得分:0)

你应该举报。

在短期内,你可以将源文件中的那一行修改为:

try:
    uc = unichr(int(name, base))
except ValueError:
    if base == 10 and name[0].lower() == "x":
        uc = unichr(int(name[1 : ], 16))
    else:
        raise