2009-05-04 2 views
2

에서 MP3 파일의 URL의 href 속성에 대한 정규식이 필요합니다, 나는 파이썬 re 모듈을 사용하여이 정규식 함께했다 :내가 cgoldberg에 의해 이전 스택 오버플로 질문 공헌을 바탕으로 파이썬

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

변수의 URL은 반복 가능 객체와 내가 하나 이상있는 경우 개별적으로 MP3 파일의 URL에 액세스 루프를 사용할 수 있습니다

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

이 기술은, 그러나, 때때로 작동합니다. 나는 정규 표현식이 완벽하게 구현 된 파서 모듈만큼 신뢰할 수 없다는 것을 알고있다. 그러나 때로는 동일한 페이지에서 신뢰할 수 없습니다.

일부 URL 항목에 대해 http 이전의 모든 것을 수신하는 경우가 있습니다.

정규식에 비교적 익숙합니다. 그래서, 그것에 대해 갈 수있는보다 믿을만한 방법이 있는지 궁금합니다.

미리 감사드립니다. stackoverflow를 처음 접 하시면서 몇 가지 답변을 제공해 주실 것을 기대합니다.

+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

피터에게 감사드립니다. 나는 개인적으로 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이 하나의 긴 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은 하나의 긴 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

Thanks Paolo. 나는 lxml로 마이그레이션하기 전에 항상 Beautiful Soup에 의지했습니다. 이 경우에는 lxml과 같은 양의 행만 필요하다는 것을 알면 놀라실 것입니다. –

+0

이는'for mp3s : l '['href ']' –