8

一部のテキスト ファイルを HTML コードに変換する必要があります。リストを HTML 順不同リストに変換するのに行き詰まっています。ソースの例:

ドキュメント内のテキスト
* アイテム 1
* アイテム 2
* アイテム 3
その他のテキスト

出力は次のようになります。

some text in the document
<ul>
    <li>item 1</li>
    <li>item 2</li>
    <li>item 3</li>
</ul>
some other text

現在、私はこれを持っています:

r = re.compile(r'\*(.*)\n')
r.sub('<li>\1</li>', the_text_document)

< ul >タグなしの HTML リストを作成します。最初と最後の項目を識別してタグ
で囲むにはどうすればよいですか?< ul >

4

3 に答える 3

1

データを1行ずつ処理するだけで済みます。以下のこの迅速で汚い解決策はおそらく整理される可能性がありますが、データの場合はうまくいきます。

with open('data.txt') as inf:
    star_count = 0
    for line in inf:
        line = line.strip()

        if not line.startswith('*'):
            if star_count == 1:
                print'</ul>'
            print line
        else:
            if star_count == 0:
                print '<ul>'
                star_count = 1
            print '  <li>%s</li>'  %line.split('*')[1].strip()

収量:

some text in the document
<ul>
  <li>item 1</li>
  <li>item 2</li>
  <li>item 3</li>
</ul>
some other text

データの複雑さに応じて、または煩わしくないリストなどを繰り返す場合は、変更が必要になるため、より一般的な解決策を探すか、ニーズを満たすためにこのスターターコードを変更するか、自分だけが決定できます。

更新

以前に残されていたものを<li> .. </li>取り除くために印刷行を編集しました。*

于 2012-07-08T14:44:58.930 に答える
1

またはBeautifulSoupを使用してください

http://www.crummy.com/software/BeautifulSoup/bs4/doc/

編集

どうやら私はあなたにドキュメンテーションを読む方法についていくつかのヒントを与えなければなりません。

  • リンクを開く
  • 左側には大きなメニュー(ティールカラー)があります
  • 注意深く見ると、ドキュメントが複数のセクションに分かれていることに気付くでしょう。
    • もの
    • ツリー内のナビゲーション
    • ツリーを検索する
    • ツリーを変更する(わかった)
    • 出力(わかりました!)

そしてもっとたくさんのこと

Beautiful Soupは、HTMLおよびXMLファイルからデータを引き出すためのPythonライブラリです。これは、お気に入りのパーサーと連携して、解析ツリーをナビゲート、検索、および変更するための慣用的な方法を提供します。通常、プログラマーは数時間または数日の作業を節約できます

最初の文の後で読むのをやめないでください...最後の文は非常に重要であり、途中に何がありますか。

つまり、空のドキュメントを作成できます...次のように言います。

soup = BeautifulSoup("<div></div>")
document = soup.div

それからあなたはあなたのテキストの各行を読みます..そしてあなたがテキストを持っているときはいつでもそれをします。

document.append(line)

行が`*``で始まる場合

ul = document.new_tag('ul')
document.append(ul)
document = ul

次に、ドキュメントのすべてをプッシュしliます...そして、読み終えたら*、親をポップして、ドキュメントがdivに戻るようにします。そしてそれを続けてください...あなたはsに挿入するためにそれを再帰的に行うことさえできulますul

すべてを解析したら...できる

str(document)

また

document.prettify()

編集

HTMLではなくフォーマットされていないテキストを編集していることに気づきました。次にマークダウンを使用してみてください。

http://daringfireball.net/projects/markdown/

于 2012-07-08T14:48:45.713 に答える
1

いくつかのアイデアを試した後、2 番目の正規表現を使用することにしました。基本的に、最初の正規表現 (<li>タグを作成する元の投稿から) を実行した後、次を実行します。

r = re.compile(r'(<li>.*?</li>\n(?!\s*<li>))', re.DOTALL)
r.sub('<ul>\\1</ul>', string_with_li_tags)

これは、タグの最初の一致とコンボ<li>の最後の一致を見つけ、タグが続くのではなく(基本的にリスト全体を意味します)、タグを追加します。</li>\n<li><ul>

編集:貪欲にならないように、正規表現を少し変更しました。このようにして、同じドキュメント内の複数のリストを処理できます。唯一の要件は、以下で言及されている @Aprillion のように、リスト項目間にスペースがないことです。

EDIT 2:リスト項目間のスペースも処理するように否定先読みを変更したため、すべてのケースがカバーされます

于 2012-07-08T17:16:52.997 に答える