Python lxml在使用简单自定义解析器时引发TypeError

Python lxml在使用简单自定义解析器时引发TypeError,python,xml-parsing,lxml,Python,Xml Parsing,Lxml,我已经编写了以下简单的解析器(在我稍微复杂的程序中展示这个问题),它从中的所有条目中提取标题 在dblp.xml文件上运行此代码时,它会运行一段时间(生成大约72K的内容),然后引发以下错误消息 Traceback (most recent call last): File "C:/Users/je24621/Desktop/dblp-example2.py", line 30, in <module> results = etree.parse(infile, pars

我已经编写了以下简单的解析器(在我稍微复杂的程序中展示这个问题),它从中的所有条目中提取标题

在dblp.xml文件上运行此代码时,它会运行一段时间(生成大约72K的内容),然后引发以下错误消息

Traceback (most recent call last):
  File "C:/Users/je24621/Desktop/dblp-example2.py", line 30, in <module>
    results = etree.parse(infile, parser)
  File "lxml.etree.pyx", line 3197, in lxml.etree.parse (src\lxml\lxml.etree.c:65042)
  File "parser.pxi", line 1571, in lxml.etree._parseDocument (src\lxml\lxml.etree.c:93101)
  File "parser.pxi", line 1600, in lxml.etree._parseDocumentFromURL (src\lxml\lxml.etree.c:93388)
  File "parser.pxi", line 1500, in lxml.etree._parseDocFromFile (src\lxml\lxml.etree.c:92445)
  File "parser.pxi", line 1047, in lxml.etree._BaseParser._parseDocFromFile (src\lxml\lxml.etree.c:89329)
  File "parsertarget.pxi", line 160, in lxml.etree._TargetParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:100233)
  File "parsertarget.pxi", line 154, in lxml.etree._TargetParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:100143)
  File "lxml.etree.pyx", line 294, in lxml.etree._ExceptionContext._raise_if_stored (src\lxml\lxml.etree.c:9383)
TypeError: function takes exactly 5 arguments (1 given)
回溯(最近一次呼叫最后一次):
文件“C:/Users/je24621/Desktop/dblp-example2.py”,第30行,在
results=etree.parse(infle,parser)
lxml.etree.parse(src\lxml\lxml.etree.c:65042)中的文件“lxml.etree.pyx”,第3197行
文件“parser.pxi”,第1571行,在lxml.etree.\u parseDocument(src\lxml\lxml.etree.c:93101)中
文件“parser.pxi”,第1600行,在lxml.etree.\u parseDocumentFromURL(src\lxml\lxml.etree.c:93388)中
文件“parser.pxi”,第1500行,在lxml.etree.\u parseDocFromFile(src\lxml\lxml.etree.c:92445)中
lxml.etree.\u BaseParser.\u parseDocFromFile(src\lxml\lxml.etree.c:89329)中的文件“parser.pxi”,第1047行
lxml.etree.\u TargetParserContext.\u handleParseResultDoc(src\lxml\lxml.etree.c:100233)中第160行的文件“parsertarget.pxi”
lxml.etree.\u TargetParserContext.\u handleParseResultDoc(src\lxml\lxml.etree.c:100143)中第154行的文件“parsertarget.pxi”
文件“lxml.etree.pyx”,第294行,在lxml.etree.\u ExceptionContext.\u如果存储,则引发(src\lxml\lxml.etree.c:9383)
TypeError:函数正好接受5个参数(给定1个)

作为参考,我是在Windows7上使用Python3.2.5和LXML3.2.1实现这一点的(不是出于选择)。如何修复/调试此问题?

我不知道您看到的实际问题是什么。我用lxml 3.2.1和Python 3.3.1尝试了今天的libxml2快照和苹果提供的2.7.8版本,在这两种情况下,它都立即失败,因为DTD无效

只需删除load\u dtd=True就可以使整个过程正常工作,有380万行输出。它显然不能正确理解DTD中指定的自定义元素和实体。您不依赖于这些元素,但实体是一个问题。例如,不替换
ä
使用
ä
,您将获得一个替换字符

因此,似乎有四种方法可以解决这个问题:

  • 找出如何使
    lxml
    对您的DTD感到满意
  • 找到一个不同的解析器来处理损坏的DTD
  • 将DTD嵌入XML文件(如中所示)
  • 不要使用DTD,而是预解析数据。由于您实际需要的只是自定义实体,因此只需将每个实体替换为其定义即可。当然,您不会以这种方式获得验证…但无论如何,您的验证都会失败

  • 对于任何感兴趣的人来说,这个问题并没有得到解决,只是库中的某个地方出现了一个bug。相反,我使用正则表达式手工解析xml。

    您有什么版本的
    libxml2
    ?(如果库中有bug,而不是代码中有bug,那么它出现在
    libxml2
    中的频率要比出现在
    lxml
    本身中的频率要高。)此外……当我下载dtd和xml.gz文件(以及gunzip the xml.gz)并运行此程序时,它会立即失败,因为dtd无效。(在
    声明之前,您不允许发表评论。)您是否使用与该站点上完全相同的文件运行?同时,如果我删除
    load\u dtd=True
    ,几秒钟后,所有操作都会成功完成,输出文件长度为3.8M(虽然它确实会破坏DTD中定义的非默认
    ü;
    实体)。我正在网站上找到的DTD文件上运行它。我将尝试删除注释。同样的错误,但我从未遇到无效DTD的问题…如何检查我的libxml2版本?
    Traceback (most recent call last):
      File "C:/Users/je24621/Desktop/dblp-example2.py", line 30, in <module>
        results = etree.parse(infile, parser)
      File "lxml.etree.pyx", line 3197, in lxml.etree.parse (src\lxml\lxml.etree.c:65042)
      File "parser.pxi", line 1571, in lxml.etree._parseDocument (src\lxml\lxml.etree.c:93101)
      File "parser.pxi", line 1600, in lxml.etree._parseDocumentFromURL (src\lxml\lxml.etree.c:93388)
      File "parser.pxi", line 1500, in lxml.etree._parseDocFromFile (src\lxml\lxml.etree.c:92445)
      File "parser.pxi", line 1047, in lxml.etree._BaseParser._parseDocFromFile (src\lxml\lxml.etree.c:89329)
      File "parsertarget.pxi", line 160, in lxml.etree._TargetParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:100233)
      File "parsertarget.pxi", line 154, in lxml.etree._TargetParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:100143)
      File "lxml.etree.pyx", line 294, in lxml.etree._ExceptionContext._raise_if_stored (src\lxml\lxml.etree.c:9383)
    TypeError: function takes exactly 5 arguments (1 given)