2016-12-03 6 views
3

python 3のマークダウンファイルから要素のリストを取得するにはどうすればよいですか?私は具体的には、マークアップファイルからすべての画像とリンク(alt-textやリンクテキストなどの関連情報とともに)のリストを取得することに関心があります。pythonのマークダウンファイルの要素を解析する3

thisこの分野ではいくつかの先行技術がありますが、この時点ではほぼ正確に2歳ですが、景色が少し変わったと思います。

あなたが思いついたパーサーがマルチマークダウンをサポートしている場合、ボーナスポイントがあります。

+0

@coralv:私は、リンクを抽出するために、正規表現の中に見えたが、私は本当にそのためにプッシュダウンオートマトンを必要とする問題に遭遇してきました、任意のネストされた括弧を考慮に入れる。私はパーサを構築する前に、主にライブラリのソリューションを探しています。 –

+0

Markdown自体は10年来変わっていないので、リンクされた質問と回答はかなり最新のものだと思います。 – Waylan

答えて

1

Python-Markdownでマークダウンをhtmlに変換してから、Beautiful Soupを使用してhtmlドキュメントから必要なものを抽出すると、画像とリンクを非常に簡単に抽出できます。

複雑なパイプラインのように見えるかもしれませんが、正規表現を使用してアドホックなマークダウンパーサーを作成するよりも、確かに簡単で強力です。これらのモジュールは、戦闘テスト済みで効率的です。

+0

Python-MarkdownはElementTreeを内部的に使用しており、拡張APIを備えています。パーサーを中断し、ElementTreeをループしてエレメントを抽出し、いくつかのステップをスキップすることができます。しかし、それは実際には意図されていない方法でものを曲げることになるので、HTML出力を解析するとおそらくより信頼性の高い結果が得られるでしょう。 – Waylan

+0

Python-Markdownには拡張機能([included](https://pythonhosted.org/Markdown/extensions/index.html#officially- supporteded-extensions)と[third-party](https:// github.com/waylan/Python-Markdown/wiki/Third-Party-Extensions))を利用できるので、MultiMarkdownの機能のすべてではないにしても、ほとんどを得ることができます。本当に気になる機能がない場合は、[自分の拡張機能を書く]ことができます(https://github.com/waylan/Python-Markdown/wiki/Tutorial:-Writing-Extensions-for-Python-Markdown)。 – Waylan

1

使用すると、2つのPythonパッケージ、pypandocpanfluteを利用する場合は、あなたが数行(sample code)でかなりpythonicallyそれを行うことができます:

は、テキストファイルexample.mdを考えると、あなたは、Pythonを持っていると仮定し3.3+、すでにpip install pypandoc panfluteした後、同じフォルダにサンプルコードを置き、シェルまたはから実行します。 IDLE。

import io 
import pypandoc 
import panflute 

def action(elem, doc): 
    if isinstance(elem, panflute.Image): 
     doc.images.append(elem) 
    elif isinstance(elem, panflute.Link): 
     doc.links.append(elem) 

if __name__ == '__main__': 
    data = pypandoc.convert_file('example.md', 'json') 
    doc = panflute.load(io.StringIO(data)) 
    doc.images = [] 
    doc.links = [] 
    doc = panflute.run_filter(action, prepare=prepare, doc=doc) 

    print("\nList of image URLs:") 
    for image in doc.images: 
     print(image.url) 

の手順は次のとおりです。

  1. 使用pypandoc値下げ文書
  2. のASTは、Docオブジェクトを作成するためにpanfluteにロード含まれているJSON文字列を取得する(panfluteはとてもストリームが必要です私たちはStringIOを使用します)
  3. run_filter関数を使用して、すべての要素を繰り返し処理し、ImageオブジェクトとLinkオブジェクトを抽出します。
  4. 次にあなたは、altテキストをURLを印刷することができ、など
関連する問題