我需要一个正则表达式,用于python中mp3文件url的href属性

我需要一个正则表达式,用于python中mp3文件url的href属性,python,regex,Python,Regex,基于之前的堆栈溢出问题和cgoldberg的贡献,我使用python re模块提出了这个正则表达式: import re urls = re.finditer('http://(.*?).mp3', htmlcode) 变量url是一个iterable对象,如果有多个,我可以使用循环分别访问每个mp3文件url: for url in urls: mp3fileurl = url.group(0) 然而,这种技术只是有时有效。我意识到正则表达式不会像成熟的解析器模块那样可靠。但是,有

基于之前的堆栈溢出问题和cgoldberg的贡献,我使用python re模块提出了这个正则表达式:

import re
urls = re.finditer('http://(.*?).mp3', htmlcode)
变量url是一个iterable对象,如果有多个,我可以使用循环分别访问每个mp3文件url:

for url in urls:
    mp3fileurl = url.group(0)
然而,这种技术只是有时有效。我意识到正则表达式不会像成熟的解析器模块那样可靠。但是,有时,对于同一页来说,这是不可靠的

我有时会在http之前收到一些url条目的所有内容

我对正则表达式比较陌生。所以,我只是想知道是否有一种更可靠的方法来解决这个问题

提前谢谢。
刚接触stackoverflow,并期待提供一些答案。

首先,是的,您可能应该使用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内使用了点。最糟糕的副作用是,一个非mp3url后跟一个mp3url将被视为一个长URL。例如:“snarf snarf”。您可能需要某种分隔符(空格、引号,具体取决于您的操作),并且不允许在URL中使用某些字符(可能是相同的字符和/或URL中不允许使用的任何字符)。还有,你忘了逃出“.in”.mp3”。所以“”将匹配为“”。

一如既往,我建议使用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

正如其他答案所指出的,使用正则表达式解析HTML=糟糕,糟糕的主意

考虑到这一点,我将添加我最喜欢的解析器的代码:


谢谢你,劳伦斯。这澄清了一些事情。在使用解析器之前,我将再尝试几次正则表达式(只是为了学习如何正确使用它们)。但是,您非常准确地描述了这个问题:非mp3 URL后跟mp3 URL将被视为一个长URL。谢谢Peter。我个人是lxml的粉丝,Ian Bicking也一直在做什么。这只是对Peter回答的一个小警告。变量url是无法声明endswith方法(字符串方法)的对象。只需将url转换为字符串格式,即str(url),即可使用endswith方法。在迁移到lxml之前,我总是求助于美丽的汤。令人惊讶的是,在这种情况下,它只需要与lxml相同的行数。这应该是mp3s中l的
:print l['href']
-1:没有“不可靠”的定义。“有时才有效”是含糊不清的。你有没有具体的例子不适用?从错误中进行一些错误回溯?一些样本数据在什么地方特别断裂?请提供最小的例子,你可以在哪里这不起作用。
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']