HTML から LaTex: Python と lxml を使用して、カスタム マクロを使用して HTML ドキュメントを LaTeX に変換する方法

HTML から LaTex: Python と lxml を使用して、カスタム マクロを使用して HTML ドキュメントを LaTeX に変換する方法

Python を使用して、既知のタグ セットを含む HTML5 ドキュメントを取得し、カスタマイズされた LaTeX マクロを使用して高品質の印刷を行うために LaTeX に変換したいと考えています。

答え1

私は多くのツールを見て、HTMLタグをLaTeXマークアップにマッピングする再帰関数を備えたlxmlに落ち着きました。これはPythonでマッピングを簡単に定義できる場所を提供します。私は本の例を参考にして作業したと思います。Python ネットワークプログラミングの基礎

以下は Python 2.7 での最小限の動作例です。

# convert html document to LaTeX
import lxml.html # http://lxml.de/lxmlhtml.html
from lxml import etree
from io import StringIO, BytesIO

def html2latex(el): # fill in this function to catch and convert html tags
    result = []
    if el.text:
        result.append(el.text)
    for sel in el:
        if False: # get info
            print('tag',sel.tag)
            print('text',sel.text)
            print('tail',sel.tail)
            print('attrib',sel.attrib)
        if sel.tag in ["h1"]:
            result.append('\hmchapter{%s}' % html2latex(sel))
        elif sel.tag in ["td", "table"]:
            result.append("<%s>" % sel.tag)
            result.append(html2latex(sel))
            result.append("</%s>" % sel.tag)
        elif sel.tag in ["span"]:  #
            for att in sel.attrib.keys():
                if att =='style':
                    if sel.attrib[att] == 'font-style:italic':
                        result.append(r'\textit{%s}' % (html2latex(sel)))
        else:
            result.append(html2latex(sel))
        if sel.tail:
            result.append(sel.tail)
    return "".join(result)

def main():
    # must be unicode or lxml parse crashes
    html = u'''
<!DOCTYPE html>
    <html>
  <head>
    <title></title>
  </head>
<body >
  <h1 class="hmchapter" data-hmvarbodychaptertitle = "My title">My title</h1>
  text <span style="font-style:italic">in a specific context</span> and more.
</body>
</html>
'''
    parser = etree.HTMLParser()
    tree   = etree.parse(StringIO(html), parser) # expects a file, use StringIO for string
    root = tree.getroot()
    latex = html2latex(root)
    print latex

if __name__ == '__main__':
    main()

次のように出力されます:

\hmchapter{My title}
text \textit{in a specific context} and more.

関連情報