2013-07-21 15 views
6

次のように私はPythonの「再」モジュールを使用しています:Pythonの「re」モジュールが機能していませんか?

request = get("http://www.allmusic.com/album/warning-mw0000106792") 
print re.findall('<hgroup>(.*?)</hgroup>', request) 

私がやっているすべてはthis siteのHTMLを取得し、コードのこの特定のスニペットを探しています:

<hgroup> 
    <h3 class="album-artist"> 
     <a href="http://www.allmusic.com/artist/green-day-mn0000154544">Green Day</a>  </h3> 

    <h2 class="album-title"> 
     Warning  </h2> 
</hgroup> 

しかし、空の配列を出力し続けます。どうしてこれなの?なぜこのスニペットを見つけられないのですか?

+0

'についてそれは何に一致するはずですか? – Joe

答えて

9

あなたが解析しているHTMLが複数の行にあります。あなたはこのようなfindallre.DOTALLフラグを渡す必要があります:

print re.findall('<hgroup>(.*?)</hgroup>', request, re.DOTALL) 

これは改行にマッチ.することを可能にし、正しい出力を返します。

@jsalonenはもちろん、正規表現でHTMLを解析するのは難しい問題です。しかし、このような小規模なケースでは、特にワン・オフ・スクリプトの場合、受け入れ可能だと言います。

+1

真剣にみんな。 HTMLの正規表現ですか? 1回か2回は動作するかもしれませんが、最終的には失敗するようになります。正規表現は通常の言語であり、HTMLはそうではありません。 – jsalonen

+0

@jsalonen、htmlのサブセットでは問題ありません。たとえば、リンクした2番目の答えを参照してください – RiaD

+1

時にはうまくいくかもしれませんが、実際には非常に悪いエンジニアリングプラクティスです。また、実際のHTMLパーサーを使用するのと同じくらい簡単です。なぜそれをしないのですか? – jsalonen

6

reモジュールが壊れていません。あなたが遭遇する可能性があるのは、すべてのHTMLを簡単な正規表現と簡単にマッチさせることができないという事実です。

代わりに、BeautifulSoupのような実際のHTMLパーサを使用してHTMLを解析してみてください。

from BeautifulSoup import BeautifulSoup 
from requests import get 

request = get("http://www.allmusic.com/album/warning-mw0000106792") 
soup = BeautifulSoup(request.content) 
print soup.findAll('hgroup') 

または代わりに、pyqueryで:

from pyquery import PyQuery as pq 

d = pq(url='http://www.allmusic.com/album/warning-mw0000106792') 
print d('hgroup') 
+2

何らかの理由で、私はこれよりもかなり努力して 'BeautifulSoup'を思い出しました。当時はそれを使用していたのはおそらく私の未熟な経験でした。私はこのソリューションがいかに簡単かに驚いています。 +1 –

関連する問題