Python Jython 2.5.1:UnicodeDecodeError

Python Jython 2.5.1:UnicodeDecodeError,python,beautifulsoup,jython-2.5,html5lib,qf-test,Python,Beautifulsoup,Jython 2.5,Html5lib,Qf Test,最近,我一直在尝试使用QF测试3.5.4中的Jython脚本解析HTML文件中的数据(请注意,根据版本3.5.1的发行说明,受支持的Python版本仅为2.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

最近,我一直在尝试使用QF测试3.5.4中的Jython脚本解析HTML文件中的数据(请注意,根据版本3.5.1的发行说明,受支持的Python版本仅为2.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
UnicodeCodeError:“UnicodeScape”编解码器无法解码位置48-54的字节:非法Unicode字符
位于org.python.core.PyException.fillInStackTrace(PyException.java:70)
位于java.lang.Throwable。(Throwable.java:181)
位于java.lang.Exception。(Exception.java:29)
位于java.lang.RuntimeException。(RuntimeException.java:32)
位于org.python.core.PyException(PyException.java:46)
位于org.python.core.PyException.doRaise(PyException.java:200)
位于org.python.core.Py.makeException(Py.java:1171)
位于org.python.core.Py.makeException(Py.java:1175)
位于org.python.core.Py.makeException(Py.java:1179)
位于org.python.core.Py.makeException(Py.java:1183)
在qfcomon$py.runscript$52(/opt/qftest/qftest-3.5.4/jython/Lib/qfcomon.py:962)
at qfcomon$py.call_函数(/opt/qftest/qftest-3.5.4/jython/Lib/qfcomon.py)
位于org.python.core.PyTableCode.call(PyTableCode.java:165)
位于org.python.core.PyBaseCode.call(PyBaseCode.java:182)
在org.python.core.PyFunction.\uuuu调用(PyFunction.java:350)
在qftest$py.runscript$3(/opt/qftest/qftest-3.5.4/jython/Lib/qftest.py:91)
在qftest$py.call_函数(/opt/qftest/qftest-3.5.4/jython/Lib/qftest.py)
位于org.python.core.PyTableCode.call(PyTableCode.java:165)
位于org.python.core.PyBaseCode.call(PyBaseCode.java:182)
在org.python.core.PyFunction.\uuuu调用(PyFunction.java:350)
在org.python.pycode._pyx386.f$0(:1)
在org.python.pycode._pyx386.call_function()
位于org.python.core.PyTableCode.call(PyTableCode.java:165)
位于org.python.core.PyCode.call(PyCode.java:18)
位于org.python.core.Py.runCode(Py.java:1209)
位于org.python.core.Py.exec(Py.java:1253)
位于org.python.util.PythonInterpreter.exec(PythonInterpreter.java:173)
位于de.qfs.apps.qftest.shared.script.JythonEngine.exec(源文件:195)
位于org.apache.bsf.BSFManager$6.run(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于org.apache.bsf.BSFManager.exec(未知源)
位于de.qfs.apps.qftest.run.RMIRunContext.runScript(源文件:1875)
... 还有16个
我成功地将问题追溯到“inputstream.py”的导入,这是错误发生的时间点

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

编辑:

通过修改inputstream.py修复:

invalid_unicode_re = re.compile("[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uD800-\uDFFF\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]")

#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])")
无效\u unicode\u re=re.compile(“(0\0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 7 7 7 7 7 7 7 7 7 7-\ufFDFDFDFDFDFDFDFD\UF\UF\UF\uf夫夫夫夫夫夫夫夫夫夫或或或UF\uf杰夫杰夫杰夫\uf杰夫杰夫\uf杰夫杰夫\uf夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫夫U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF])
#疯狂
如果len(“\U0010FFFF”)==1:
self.reportCharacterErrors=self.characterErrorsUCS4
self.replaceCharactersRegexp=re.compile(“[\uD800-\uDFFF]”)
其他:
self.reportCharacterErrors=self.characterErrorsUCS2

self.replaceCharactersRegexp=re.compile(([\uD800-\uDBFF](?![\uDC00-\uDFFF]))|(?[2016年年中大量重写以更新。]

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


如果您想尝试使用Jython 2.5,您需要的不仅仅是替换
无效的\u unicode\u re
,请参阅。我建议尝试运行修改后的testsuite。另外,请注意,现在我们至少需要Python 2.6,而支持2.5的任何变体现在都需要大量的工作。

我想我们给出了一些建议在这一点上,输出是一堆字符。相反,我们现在的目标是用Java创建我们自己的解析器,并将其与QF测试集成。不过,感谢您的回答,现在我们将不再使用Jython尝试类似的操作。如果您想在Java中使用一致的HTML解析器,可以使用JSoup和Validator.nu HTML解析器。可能还有其他的。May/May没有比自己写更好的了。