【问题标题】:How to read mathML with entity references using lxml in python如何在 python 中使用 lxml 读取带有实体引用的 mathML
【发布时间】:2014-05-20 13:35:14
【问题描述】:

我正在尝试使用 lxml 读取 MathML 文件

import lxml.etree as et

#function that reads the xhtml file and returns the root of the document
def getData(fname):
    f=open(fname)
    d=f.read()
    data = d.replace('\n','')
    root = et.fromstring(data)
    return root

def main():
    r = getData('integral_example.xhtml')
    print et.tostring(r)

if __name__ == '__main__':
    main()

integral_example.xhtml:

<!-- begin MathToWeb -->
<!-- (your LaTeX) $ \int_a^b f(x)\,dx. $ -->
<!DOCTYPE math SYSTEM "http://www.w3.org/Math/DTD/mathml1/mathml.dtd">
<math>
<mrow> 
    <mstyle displaystyle="true">
        <munderover>
            <mo>&int;</mo>
            <mi>a</mi>
            <mi>b</mi>
        </munderover>
    </mstyle>
    <mi>f</mi>
    <mrow>
        <mo maxsize="1.00em" form="prefix">(</mo>
        <mi>x</mi>
        <mo maxsize="1.00em" form="postfix">)</mo>
    </mrow>
    <mspace width="0.167em" />
    <mo>&dd;</mo>
    <mi>x</mi>
    <mo>.</mo>
</mrow>
</math>
<!-- end MathToWeb -->

so_question.py 是上面给出的 python 代码。我运行时的输出如下:

Venkateshs-MacBook-Pro:mathml_examples venkatesh$ python so_question.py

Traceback (most recent call last):
  File "so_question.py", line 14, in <module>
    main()
  File "so_question.py", line 11, in main
    r = getData('integral_example.xhtml')
  File "so_question.py", line 7, in getData
    root = et.fromstring(data)
  File "lxml.etree.pyx", line 3003, in lxml.etree.fromstring (src/lxml/lxml.etree.c:67277)
  File "parser.pxi", line 1785, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:101626)
  File "parser.pxi", line 1673, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:100455)
  File "parser.pxi", line 1074, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:95637)
  File "parser.pxi", line 582, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:90446)
  File "parser.pxi", line 683, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:91632)
  File "parser.pxi", line 622, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:90928)
lxml.etree.XMLSyntaxError: Entity 'int' not defined, line 1, column 197

我哪里错了?

【问题讨论】:

    标签: python lxml mathml


    【解决方案1】:

    要从 DTD 加载实体,请在创建解析器时使用 load_dtd=True 选项。还有set no_network=False 允许在查找外部文档时访问网络(在本例中为http://www.w3.org/Math/DTD/mathml1/mathml.dtd)。

    import lxml.etree as ET
    
    # function that reads the xhtml file and returns the root of the document
    
    
    def getData(fname):
        with open(fname) as f:
            parser = ET.XMLParser(load_dtd=True, no_network=False) 
            doc = ET.parse(f, parser=parser)
            return doc.getroot()
    
    
    def main():
        r = getData('integral_example.xhtml')
        print ET.tostring(r)
    
    if __name__ == '__main__':
        main()
    

    产量

    <!DOCTYPE math SYSTEM "http://www.w3.org/Math/DTD/mathml1/mathml.dtd">
    <math>
    <mrow> 
        <mstyle displaystyle="true">
            <munderover>
                <mo>&#8747;</mo>
                <mi>a</mi>
                <mi>b</mi>
            </munderover>
        </mstyle>
        <mi>f</mi>
        <mrow>
            <mo maxsize="1.00em" form="prefix">(</mo>
            <mi>x</mi>
            <mo maxsize="1.00em" form="postfix">)</mo>
        </mrow>
        <mspace width="0.167em"/>
        <mo>&#63308;</mo>
        <mi>x</mi>
        <mo>.</mo>
    </mrow>
    </math><!-- end MathToWeb -->
    

    如果你不想解析实体,那么你可以使用

    parser = ET.XMLParser(resolve_entities=False)
    

    相反;它更快,但是

    <mo>&int;</mo>
    

    没有改成

    <mo>&#8747;</mo>
    

    【讨论】:

    • 我尝试运行答案中的代码,但我得到了同样的错误。我尝试将 Dtd 下载到我的机器上,并使用文件的路径而不是 url 来引用它。当我使用 DTD 的本地副本时,我将 no_network 参数设置为 True。我还有什么遗漏的吗?
    • 嗨。对之前的评论感到抱歉。您答案中的代码效果很好!我猜我用作输入的 xhtml 文件中存在一些问题。当我运行您的代码时,仍然无法弄清楚我的错误到底是什么。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2022-09-27
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多