部分的な html テキストから html タグではないすべてを抽出するにはどうすればよいですか?
つまり、次のようなものがある場合:
<div>Hello</div><h3><div>world</div></h3>
['Hello','world'] を抽出したい
私は正規表現について考えました:
>[a-zA-Z0-9]+<
ただし、必要な特殊文字や中国語またはヘブライ文字は含まれません
HTMLからテキストを抽出するには、正規表現のようなものを見る必要があります
その投稿から:
HTML を正規表現で解析することはできません。複雑すぎます。RE の処理はブラウザでは適切なテキストとして機能しませんが、素朴な RE を困惑させる可能性があります。
適切な HTML パーサーを使用すると、より満足して成功することができます。Python 関係者は、HTML を解析してタグやスクリプトを削除するために、何か Beautiful Soup をよく使用します。
また、ブラウザーは、設計上、不正な形式の HTML を許容します。そのため、明らかに不適切な HTML を解析しようとしていることに気付くことがよくありますが、たまたまブラウザーでは問題なく動作します。
RE を使用すると、不適切な HTML を解析できる場合があります。必要なのは忍耐と努力だけです。しかし、多くの場合、他の誰かのパーサーを使用する方が簡単です。
Avi が既に指摘したように、これは正規表現には複雑すぎるタスクです。get_text
fromBeautifulSoup
またはclean_html
fromを使用しnltk
て、html からテキストを抽出します。
from bs4 import BeautifulSoup
clean_text = BeautifulSoup(html).get_text()
また
import nltk
clean_text = nltk.clean_html(html)
GuillaumeA のおかげで、もう 1 つのオプションはpyqueryを使用することです。
from pyquery import PyQuery
clean_text = PyQuery(html)
上記の html パーサーは、html が適切に形成されていない場合、さまざまなレベルの成功で仕事を行うと言わなければなりません。そのため、入力データに最適なものを実験して確認する必要があります。
Python には詳しくありませんが、次の正規表現が役に立ちます。
<\s*(\w+)[^/>]*>
どこ、
<: starting character
\s*: it may have whitespaces before tag name (ugly but possible).
(\w+): tags can contain letters and numbers (h1). Well, \w also matches '_', but it does not hurt I guess. If curious use ([a-zA-Z0-9]+) instead.
[^/>]*: anything except > and / until closing >
\>: closing >