8

次のように、Python の「re」モジュールを使用しています。

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

私がしているのは、このサイトの 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>

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

4

2 に答える 2

10

解析している HTML は複数の行にあります。次のようにre.DOTALLフラグを渡す必要があります。findall

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

これにより.、改行の一致が可能になり、正しい出力が返されます。

もちろん、@jsalonen は正しく、HTML を正規表現で解析するのは難しい問題です。ただし、このような小さなケース、特に 1 回限りのスクリプトの場合は、許容できると思います。

于 2013-07-21T20:41:31.033 に答える
7

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')
于 2013-07-21T20:41:01.010 に答える