2009-05-04 15 views
2

でmp3ファイルURLのhref属性のための正規表現を必要とする、私はモジュール再パイソンを使用して、この正規表現を思い付いた:私はcgoldbergによって、以前のスタックオーバーフローの質問や貢献度に基づいてのpython

import re 
urls = re.finditer('http://(.*?).mp3', htmlcode) 

変数のURLが反復可能オブジェクトであり、私は2つ以上が存在する場合、個別に各mp3ファイルのURLにアクセスするためにループを使用することができます。

for url in urls: 
    mp3fileurl = url.group(0) 

この技術は、しかし、時々しか動作します。私は正規表現が完全な本格的なパーサーモジュールほど信頼性が高くないことを認識しています。しかし、時々、これは同じページでは信頼できません。

一部のURLエントリでは、httpの前にすべてのものが受信されることがあります。

私は正規表現に比較的新しいです。だから、もっと信頼できる方法があるのだろうかと思っています。

ありがとうございます。 また、いくつかの回答を寄稿することを楽しみにしています。

+0

-1:「信頼できない」のない定義を。 「時にはうまくいく」というのはあいまいです。これがうまくいかない具体例がありますか?エラーからのいくつかのエラーのトレースバック?具体的に破損しているサンプルデータこれがうまくいかない場合はできるだけ小さな例を提供してください。 –

答えて

2

は、いつものように私は、htmlファイルから情報を抽出するために、代わりに正規表現のlxml.htmlようなHTMLパーサを使用することをお勧め:

import lxml.html 

tree = lxml.html.fromstring(htmlcode) 
for link in tree.findall(".//a"): 
    url = link.get("href") 
    if url.endswith(".mp3"): 
     print url 
+0

Peterに感謝します。私は個人的にはlxmlのファンであり、Ian Bickingのやっていることもあります。 –

+0

ピーターの答えに対するちょっとした注意点。変数urlは、endswithメソッド(文字列メソッド)を宣言できないオブジェクトです。endswithメソッドを使用するには、urlを文字列形式(str(url))に変換するだけです。 –

2

まずは、おそらく、HTMLパーサを使用しているはずです。 Pythonに付属のHTMLParserモジュールを使用したサンプルコードをいくつか示します。

from HTMLParser import HTMLParser 

class ImgSrcHTMLParser(HTMLParser): 
    def __init__(self): 
    HTMLParser.__init__(self) 
    self.srcs = [] 

    def handle_starttag(self, tag, attrs): 
    if tag == 'img': 
     self.srcs.append(dict(attrs).get('src')) 

parser = ImgSrcHTMLParser() 
parser.feed(html) 
for src in parser.srcs: 
    print src 

これはimgタグからsrcを収集します。あなたが '.mp3'で終わる 'a'タグのhrefを必要としていると仮定すると、それをあなたの目的に適応させるのはかなり簡単です。

実際に正規表現を使用したいと仮定して、あなたの正規表現にいくつかの問題があります。あなたはURLを区切っておらず、URLの中にドットを使用しています。最悪の副作用は、mp3以外のURLとそれに続くmp3-URLが1つの長いURLとして扱われることです。例:「http://foo/bar.gif snarf snarf http://baz/quux.mp3」。デリミタ(空白、引用符、あなたのやっていることに依存します)を必要とし、URLの中のいくつかの文字を許可したくないでしょう(恐らく同じ文字やURLに許可されていない文字)。また、 "。"を逃れるのを忘れた".mp3"で。 「http://foo/mp3icon.gif」は「http://foo/mp3」と一致します。

+0

ありがとうLaurence。これはいくつかのことをクリアします。私は正規表現にパーザのルートに行く前にもう少し試してみましょう。しかし、あなたは問題を非常に正確に説明しました。mp3以外のURLとそれに続くmp3 URLは1つの長いURLとして扱われます。 –

3

他の回答で指摘したように、HTML =悪い、悪いを解析するために正規表現を使用してアイディア。念頭に置いて

、私は私のお気に入りのパーサーのコードに追加しません:BeautifulSoup

from BeautifulSoup import BeautifulSoup 

soup = BeautifulSoup(htmlcode) 
links = soup.findAll('a', href=True) 
mp3s = [l for l in links if l['href'].endswith('.mp3')] 
for song in mp3s: 
    print link['href'] 
+0

ありがとうPaolo。私はlxmlに移行する前にいつもBeautiful Soupに頼っていました。この場合、lxmlと同じ量の行しか必要としないことに驚いています。 –

+0

これは 'for mp3s in:l '[' href ']' –

関連する問題