Jython 2.5.1: UnicodeDecodeError



最近我一直在尝试使用 QF-Test 3.5.4 中的 Jython 脚本解析 HTML 文件中的数据(请注意,根据版本 3.5.1 的发行说明,支持的 Python 版本仅为 2.5.1 http://www.qfs.de/en/qftest/relnotes.html#3.5.1。

Python

库(旧,因为我需要对 Python 2.x 的支持):

  • HTML5lib 0.95
  • 美丽汤 3.2.1

我正在运行Xubuntu 13.10。

Jython 脚本如下所示:

    #Script uses obsolete Python libraries because QF-Test only supports Python 2.5.1
import urllib
#BeautifulSoup 3.2.1 - Python 2.x support
import BeautifulSoup
#html5lib 0.95 - has Python 2.5.1 support
from html5lib import sanitizer
from html5lib import treebuilders
#URL of HTML file that has been saved locally
url = 'Tlacovky/$(website)'
fp = urllib.urlopen(url)
#create HTML5 parser
parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("beautifulsoup"), tokenizer=sanitizer.HTMLSanitizer)
html5lib_object = parser.parse(file_pointer)
html_string = str(html5lib_object)
#load to BS
soup = BeautifulSoup(html_string)
for content in soup.findAll('script'):
    print content

现在,当我尝试使用我需要正确设置的所有变量执行脚本时,我得到这个:

UnicodeDecodeError: 'unicodeescape' codec can't decode bytes in position 48-54: illegal Unicode character
    at org.python.core.PyException.fillInStackTrace(PyException.java:70)
    at java.lang.Throwable.<init>(Throwable.java:181)
    at java.lang.Exception.<init>(Exception.java:29)
    at java.lang.RuntimeException.<init>(RuntimeException.java:32)
    at org.python.core.PyException.<init>(PyException.java:46)
    at org.python.core.PyException.doRaise(PyException.java:200)
    at org.python.core.Py.makeException(Py.java:1171)
    at org.python.core.Py.makeException(Py.java:1175)
    at org.python.core.Py.makeException(Py.java:1179)
    at org.python.core.Py.makeException(Py.java:1183)
    at qfcommon$py.runscript$52(/opt/qftest/qftest-3.5.4/jython/Lib/qfcommon.py:962)
    at qfcommon$py.call_function(/opt/qftest/qftest-3.5.4/jython/Lib/qfcommon.py)
    at org.python.core.PyTableCode.call(PyTableCode.java:165)
    at org.python.core.PyBaseCode.call(PyBaseCode.java:182)
    at org.python.core.PyFunction.__call__(PyFunction.java:350)
    at qftest$py.runscript$3(/opt/qftest/qftest-3.5.4/jython/Lib/qftest.py:91)
    at qftest$py.call_function(/opt/qftest/qftest-3.5.4/jython/Lib/qftest.py)
    at org.python.core.PyTableCode.call(PyTableCode.java:165)
    at org.python.core.PyBaseCode.call(PyBaseCode.java:182)
    at org.python.core.PyFunction.__call__(PyFunction.java:350)
    at org.python.pycode._pyx386.f$0(<string>:1)
    at org.python.pycode._pyx386.call_function(<string>)
    at org.python.core.PyTableCode.call(PyTableCode.java:165)
    at org.python.core.PyCode.call(PyCode.java:18)
    at org.python.core.Py.runCode(Py.java:1209)
    at org.python.core.Py.exec(Py.java:1253)
    at org.python.util.PythonInterpreter.exec(PythonInterpreter.java:173)
    at de.qfs.apps.qftest.shared.script.JythonEngine.exec(SourceFile:195)
    at org.apache.bsf.BSFManager$6.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.apache.bsf.BSFManager.exec(Unknown Source)
    at de.qfs.apps.qftest.run.RMIRunContext.runScript(SourceFile:1875)
    ... 16 more

我成功地将问题追溯到导入"inputstream.py",这是发生错误的点。

我真的用这个把头发了。如果可以,请帮我解决这个问题。

编辑:

通过修改 inputstream.py 修复:

invalid_unicode_re = re.compile("[u0001-u0008u000Bu000E-u001Fu007F-u009FuD800-uDFFFuFDD0-uFDEFuFFFEuFFFFU0001FFFEU0001FFFFU0002FFFEU0002FFFFU0003FFFEU0003FFFFU0004FFFEU0004FFFFU0005FFFEU0005FFFFU0006FFFEU0006FFFFU0007FFFEU0007FFFFU0008FFFEU0008FFFFU0009FFFEU0009FFFFU000AFFFEU000AFFFFU000BFFFEU000BFFFFU000CFFFEU000CFFFFU000DFFFEU000DFFFFU000EFFFEU000EFFFFU000FFFFEU000FFFFFU0010FFFEU0010FFFF]")
#Craziness
if len("U0010FFFF") == 1:
            self.reportCharacterErrors = self.characterErrorsUCS4
            self.replaceCharactersRegexp = re.compile("[uD800-uDFFF]")
        else:
            self.reportCharacterErrors = self.characterErrorsUCS2
            self.replaceCharactersRegexp = re.compile("([uD800-uDBFF](?![uDC00-uDFFF])|(?<![uD800-uDBFF])[uDC00-uDFFF])")

[在2016年中期进行了大量重写,以更新。

html5lib不支持Jython 2.5,而且从来没有。html5lib 0.9999 中引入了一定程度的支持,但这需要 Jython 2.7(值得注意的是,不能保证支持,但原则上它可以工作)。

如果你想尝试让它与Jython 2.5一起工作,你需要的不仅仅是替换invalid_unicode_re,请参阅此错误。我建议尝试使用您的修改运行测试套件。另请注意,现在我们至少需要 Python 2.6,并且现在支持 2.5 的任何变体都需要大量工作。

相关内容

  • 没有找到相关文章

最新更新