正規表現一致の一部を抽出する


130

HTMLページからタイトルを抽出する正規表現が必要です。現在私はこれを持っています:

title = re.search('<title>.*</title>', html, re.IGNORECASE).group()
if title:
    title = title.replace('<title>', '').replace('</title>', '') 

<title>のコンテンツのみを抽出する正規表現はありますか?タグを削除する必要はありませんか?


5
すごいHTMLページ全体を解析して単純なタイトルを抽出するために呼び出すすべての応答を信じることはできません。やりすぎ!
hoju

4
質問のタイトルはそれをすべて言います-与えられた例はたまたま HTMLですが、一般的な問題は...
Phil

回答:


207

使用( )正規表現中やgroup(1)撮影した文字列を取得するためのPythonで(re.search戻りますNone、それは結果が見つからない場合はそう、使用しないgroup()で直接):

title_search = re.search('<title>(.*)</title>', html, re.IGNORECASE)

if title_search:
    title = title_search.group(1)

1
タイトルが見つからないときに何もしない場合、なぜgroup()を直接使用するのが悪いのでしょうか?(とにかく例外をキャッチできます)
tonfa

1
そうです、しかしほとんどの人は例外を忘れており、実行時にそれらを見ると本当に驚きます:)
KrzysztofKrasoń09年

実行することを忘れないでください。そうしないと、import re次のような結果になりますNameError: name 're' is not defined
Powers

16

開始時Python 3.8、および割り当て式の導入(PEP 572):=演算子)であることに注意してください。一致条件を変数としてif条件内で直接キャプチャーし、それを条件の本体で再利用することにより、Krzysztof Krasosのソリューションを少し改善できます。 :

# pattern = '<title>(.*)</title>'
# text = '<title>hello</title>'
if match := re.search(pattern, text, re.IGNORECASE):
  title = match.group(1)
# hello



4

ビューティフルスープをお勧めします。Soupは、すべてのHTMLドキュメントを解析するための非常に優れたライブラリです。

soup = BeatifulSoup(html_doc)
titleName = soup.title.name

追加したいのは、beautifulsoupも不完全なhtmlを解析することです。これは本当に素晴らしいことです。
endre 2013年

3

試してください:

title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)

本当にHTML解析にREGEXを使用したい場合は、一致時に.group()を直接実行しないでください。Noneが返される可能性があるためです。
iElectric 2009

文書内に.*?複数ある場合に備えて使用する必要</title>があります(可能性は低いですが、わかりません)。
tonfa

@iElectric:本当に必要な場合は、ブロック以外の試行に配置できますよね?
tonfa

3

提供されたコードは、Exceptions 私が提案することに対応していません

getattr(re.search(r"<title>(.*)</title>", s, re.IGNORECASE), 'groups', lambda:[u""])()[0]

これは、パターンが見つからなかった場合、または最初に一致した場合、デフォルトで空の文字列を返します。


1

私はこれで十分だと思います:

#!python
import re
pattern = re.compile(r'<title>([^<]*)</title>', re.MULTILINE|re.IGNORECASE)
pattern.search(text)

...テキスト(HTML)が「text」という名前の変数にあると仮定します。

これは、HTML TITLEタグの内部に合法的に埋め込むことができる他のHTMLタグがなく、そのようなコンテナー/ブロック内に他の<文字を合法的に埋め込む方法がないことも想定しています。

しかし ...

PythonでのHTML解析に正規表現を使用しないでください。HTMLパーサーを使用してください!(完全なパーサーを作成する場合を除いて、これは、さまざまなHTML、SGML、およびXMLパーサーがすでに標準ライブラリーにある場合、追加の作業になります。

「実世界」のタグスープ HTML(SGML / XMLバリデーターに準拠していないことが多い)を処理する場合は、BeautifulSoupパッケージを使用します。(まだ)標準ライブラリにはありませんが、この目的のために広く推奨されています。

別のオプションは次のとおりです。lxml ...これは、適切に構造化された(標準に準拠した)HTML向けに記述されています。ただし、これにはパーサーとしてBeautifulSoupを使用するようにフォールバックするオプションがあります:ElementSoup

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.