1

私はテキスト(Python 2.6のコード)を持っています:

txt="foo<br><br><b>bar :</b><br>foo<br><b>bar :</b>"

次に、任意のタグ(この例では<b>タグ)の内容を抽出しようとしました。

r=re.compile("<%s.*?>(.+?)</%s>" % ("b","b"), re.I|re.S)

これはほとんど機能しますが、出力は私のトリッキーなテキストに期待したものではありません。

>>>re.findall(r,txt)
['<br><b>bar :', 'foo<br><b>bar :']

いずれにせよ、HTMLタグからテキストを抽出するための正規表現を1つ書くことは可能ですか?

4

5 に答える 5

3

一般に、regexは正規表現言語のみをキャプチャするため、regexを使用してHTMLを解析することはできません。HTML言語には任意のネストが含まれており、正規表現はこれらを処理できません。

とはいえ、正規表現コードにわずかな変更を1つ加えるだけで、一般的なhtmlの開始タグと終了タグの間のテキストを抽出できます。

r=re.compile("<%s.*?>(.+?)</%s>" % ("b","b"), re.I|re.S) 


>>> r=re.compile("<%s>(.+?)</%s>" % ("b","b"), re.I|re.S)
>>> txt="foo<br><br><b>bar :</b><br>foo<br><b>bar :</b>"
>>> re.findall(r, txt)
['bar :', 'bar :']

。*?
開始タグと一致させることができます。

ただし、この戦略では、パターンに一致する最初のタグと、パターンに一致する最初の終了タグのみが一致し、実際に開始タグとペアになるタグには一致しません。次の場合のように、同一のタグがネストされている場合に期待することは実行されません。

>>> txt="foo<b><b><b>bar :</b></b></b><br>foo<br><b>bar :</b>"
>>> re.findall(r, txt)
['<b><b>bar :', 'bar :']
>>> 
于 2012-04-24T12:51:16.497 に答える
2

他の人が指摘しているように、正規表現を使用してHTMLを解析することは、通常は良い考えではありません。htmllibを使用することをお勧めします。例えば:

import htmllib

class MyParser(htmllib.HTMLParser):     
  def __init__(self, fmt):
    htmllib.HTMLParser.__init__(self, fmt)        
    self.inb = False

  def start_b(self, data):
    self.inb = True

  def end_b(self):
    self.inb = False

  def handle_data(self, data):
    if self.inb: 
       #do sth with data
于 2012-04-24T13:00:20.550 に答える
1

またはBeautifulSoup(信じられないほど速い):

from bs4 import BeautifulSoup as soup

txt="foo<br><br><b>bar :</b><br>foo<br><b>bar :</b>"
your_text = soup(txt)
for your in your_text:
    your_text = your.findAll('b')
    print your_text.text
于 2012-04-24T13:16:35.710 に答える
1

あなたが何をしようとしているのか完全にはわかりませんが、この正規表現はあなたが望むことをしていると思います:

>>> re.findall(re.compile(r"<(\w+)>(.+?)</\1>", re.I|re.S), "foo<br><br><b>bar :</b><br>foo<br><b>bar :</b>")
[('b', 'bar :'), ('b', 'bar :')]
于 2012-04-24T12:47:29.603 に答える
1
(?<=<b>).*?(?=<\/b>)

この正規表現パターンは、タグ内のすべてのテキストを取得します。

http://regexr.com?30oga

于 2012-04-24T12:50:47.780 に答える