基于之前的堆栈溢出问题和cgoldberg的贡献,我使用python re模块得出了这个正则表达式:
import re
urls = re.finditer('http://(.*?).mp3', htmlcode)
变量url是一个可迭代的对象,如果有多个,我可以使用循环来单独访问每个mp3文件的URL:
for url in urls:
mp3fileurl = url.group(0)
然而,这种技术有时只起作用。我意识到正则表达式不如完全成熟的解析器模块可靠。但是,有时候,这对同一页面来说并不可靠。
我有时会在http之前收到一些网址条目的所有内容。
我对正则表达式比较新。所以,我只是想知道是否有更可靠的方法来解决它。
提前致谢。 stackoverflow的新手,也期待提供一些答案。
答案 0 :(得分: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']
答案 1 :(得分: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。假设您希望'a'标签的href以'.mp3'结尾,应该很容易使其适应您的目的。
假设你真的想使用正则表达式,你的正则表达式有一些问题。您没有分隔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”。
答案 2 :(得分:2)
一如既往,我建议使用像lxml.html这样的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