Мне нужно регулярное выражение для атрибута href для URL файла mp3 в Python - PullRequest
2 голосов
/ 05 мая 2009

Исходя из предыдущего вопроса о переполнении стека и вклада cgoldberg, я придумал это регулярное выражение, используя модуль python re:

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

Переменная urls является повторяемым объектом, и я могу использовать цикл для индивидуального доступа к каждому URL-адресу mp3-файла, если их несколько:

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

Эта техника, однако, работает только иногда. Я понимаю, что регулярные выражения не будут такими надежными, как полноценный модуль синтаксического анализа. Но иногда это не надежно для той же страницы.

Иногда я получаю все до http для некоторых записей URL.

Я относительно новичок в регулярных выражениях. Поэтому мне просто интересно, есть ли более надежный способ сделать это.

Заранее спасибо. Новичок в stackoverflow и с нетерпением жду ваших ответов.

Ответы [ 3 ]

3 голосов
/ 05 мая 2009

Как указывают другие ответы, использование регулярных выражений для разбора 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']
2 голосов
/ 05 мая 2009

Как всегда, я предлагаю использовать 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
2 голосов
/ 05 мая 2009

Во-первых, да, вы, вероятно, должны использовать анализатор HTML. Вот пример кода с использованием модуля HTMLParser, который поставляется с Python:

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

Это собирает src из тегов img. Должно быть довольно легко адаптировать его к вашим целям, если вы захотите получить метку 'a', заканчивающуюся на '.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".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...