1

HTMLページ内で繰り返しパターンを探しています。
私が興味を持っているパターンは、接頭辞「<h2> Seasons </ h2>」
の後に始まります。同じパターンが接頭辞の前にも発生しますが、私はそれらに興味がありません。

私は次のPythonコードで試しました(そして失敗しました)(この質問を読みやすくするために、パターンを「<ahref =。+?</a>」に簡略化しました):

matches = re.compile('<h2>Seasons</h2>.+?(<a href=.+?</a>)+',re.DOTALL).findall(page)  
for ref in matches  
   print ref

ページを考えると:

blah blah html stuff 
<h2>Seasons</h2>  
blah blah  more html stuff
<a href=http://www.111.com>111</a><a href=http://www.222.com>222</a><a href=http://www.333.com>333</a>

出力は

<a href=http://www.333.com>333</a>  

したがって、最後の一致のみが出力され、他の2つはfindallリストに含まれません。グループのすべての一致を反復処理するにはどうすればよいですか?

4

2 に答える 2

2

問題は、正規表現が1回だけ一致することです。括弧で囲まれたグループは複数回一致しますが、正規表現は全体として1回だけ一致します。これは、最後の1つだけが返されることを意味します。

これを回避するには、複数回一致する正規表現を作成する必要があります。<h2>次のように、要素にルックビハインドアサーションを使用することを検討してください。

(?<=<h2>Seasons</h2>.+?)(<a href=.+?</a>)    # doesn't work

これは要素を見つけること<a>を意味しますが、それらの前に。が付いている場合に限ります<h2>Seasons</h2>。残念ながら、後読み文字列は固定長である必要があります。.+?後読みアサーションを入れることはできません。だから、そのアプローチは出ています。

次は、最初に要素の場所を見つけて<h2>から、そこから正規表現検索を実行します。

>>> re.findall('<a href=.+?</a>', page[page.find('<h2>Seasons</h2>'):], re.DOTALL)
['<a href=http://www.111.com>111</a>', '<a href=http://www.222.com>222</a>', '<a href=http://www.333.com>333</a>']
于 2012-12-19T23:19:12.307 に答える
1

BeautifulSoupのようなhtmlパーサーを使用する必要があります; あなたの人生をずっと楽にしてくれます。

于 2012-12-19T23:16:06.513 に答える