HTMLページからタイトルを抽出する正規表現が必要です。現在、私はこれを持っています:
title = re.search('<title>.*</title>', html, re.IGNORECASE).group()
if title:
title = title.replace('<title>', '').replace('</title>', '')
<title>のコンテンツのみを抽出する正規表現があるので、タグを削除する必要はありませんか?
マークアップ言語の解析に正規表現を使用しないでください。lxmlまたはbeautifulsoupを使用してください。
キャプチャグループを使用してみてください。
title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)
re.search('<title>(.*)</title>', s, re.IGNORECASE).group(1)
提供されているコードはExceptions
に対応していません
getattr(re.search(r"<title>(.*)</title>", s, re.IGNORECASE), 'groups', lambda:[u""])()[0]
これは、パターンが見つからなかった場合、または最初に一致した場合、デフォルトで空の文字列を返します。
Python 3.8
の開始、および 割り当て式の導入(PEP 572) (:=
演算子)に注意してください。ビット上の KrzysztofKrasońのソリューション if条件内で直接一致結果を変数としてキャプチャし、条件の本体で再利用します。
# pattern = '<title>(.*)</title>'
# text = '<title>hello</title>'
if match := re.search(pattern, text, re.IGNORECASE):
title = match.group(1)
# hello
試してください:
title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)
ビューティフルスープをお勧めします。 Soupは、すべてのhtmlドキュメントを解析するための非常に優れたライブラリです。
soup = BeatifulSoup(html_doc)
titleName = soup.title.name
これで十分だと思います:
#!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パーサーが既に標準ライブラリにある場合は、追加の作業になります。
「現実世界」tag soupHTML(SGML/XMLバリデーターにしばしば適合しない)を処理する場合は、 BeautifulSoup パッケージ。 (まだ)標準ライブラリにはありませんが、この目的には広く推奨されています。
別のオプション: lxml ...これは、適切に構造化された(標準に準拠した)HTML用に記述されています。ただし、BeautifulSoupをパーサーとして使用する場合のフォールバックオプション ElementSoup があります。