Python Regex конвертировать URL YouTube в YouTube видео - PullRequest
6 голосов
/ 16 января 2011

Я делаю регулярное выражение, чтобы найти ссылки на YouTube (может быть несколько) в фрагменте HTML-текста, размещенного пользователем.

В настоящее время я использую следующее регулярное выражение, чтобы изменить 'http://www.youtube.com/watch?v=-JyZLS2IhkQ' на отображение соответствующего видео на YouTube:

return re.compile('(http(s|):\/\/|)(www.|)youtube.(com|nl)\/watch\?v\=([a-zA-Z0-9-_=]+)').sub(tag, value)

(где переменная 'tag' - это немного html, поэтому видео работает и 'оценивает' запись пользователя)

Теперь это работает .. пока URL не будет таким:

http://www.youtube.com/watch?v=-JyZLS2IhkQ&feature...'

Теперь я надеюсь, что вы, ребята, могли бы помочь мне понять, как сопоставить часть '& feature ...', чтобы она исчезла.

Пример HTML:

No replies to this post..

Youtube vid:

http://www.youtube.com/watch?v=-JyZLS2IhkQ

More blabla

Спасибо за ваши мысли, высоко ценится

Stefan

Ответы [ 4 ]

6 голосов
/ 03 октября 2013

Вот как я это решаю:

def youtube_url_validation(url):
    youtube_regex = (
        r'(https?://)?(www\.)?'
        '(youtube|youtu|youtube-nocookie)\.(com|be)/'
        '(watch\?v=|embed/|v/|.+\?v=)?([^&=%\?]{11})')

    youtube_regex_match = re.match(youtube_regex, url)
    if youtube_regex_match:
        return youtube_regex_match.group(6)

    return youtube_regex_match

ИСПЫТАНИЯ:

youtube_urls_test = [
    'http://www.youtube.com/watch?v=5Y6HSHwhVlY',
    'http://youtu.be/5Y6HSHwhVlY', 
    'http://www.youtube.com/embed/5Y6HSHwhVlY?rel=0" frameborder="0"',
    'https://www.youtube-nocookie.com/v/5Y6HSHwhVlY?version=3&hl=en_US',
    'http://www.youtube.com/',
    'http://www.youtube.com/?feature=ytca']


for url in youtube_urls_test:
    m = youtube_url_validation(url)
    if m:
        print 'OK {}'.format(url)
        print m.groups()
        print m.group(6)
    else:
        print 'FAIL {}'.format(url)
5 голосов
/ 16 января 2011

Вы должны указать свои регулярные выражения в виде необработанных строк.

Вам не нужно избегать каждого символа, который выглядит особенным, только те, которые являются .

Вместо указания пустой ветви ((foo|)), чтобы сделать что-то необязательное, вы можете использовать ?.

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

Вы можете использовать специальные наборы символов, такие как \w (равно [a-zA-Z0-9_]), чтобы сократить регулярное выражение.

r'(https?://)?(www\.)?youtube\.(com|nl)/watch\?v=([-\w]+)'

Теперь, чтобы сопоставить весь URL, вам нужно подумать о том, что может или не может следовать за ним во входных данных. Затем вы помещаете это в промежуточную группу (вы не хотите ее потреблять).

В этом примере я взял все, кроме -, =, %, & и буквенно-цифровых символов, чтобы завершить URL (слишком лениво, чтобы думать об этом сложнее).

Все, что находится между аргументом v и концом URL, нежадно используется .*?.

r'(https?://)?(www\.)?youtube\.(com|nl)/watch\?v=([\w-]+)(&.*?)?(?=[^-\w&=%])'

Тем не менее, я бы не слишком верил в это общее решение. Общеизвестно, что пользовательский ввод трудно анализировать надежно.

3 голосов
/ 17 января 2011

Что если бы вы использовали модуль urlparse , чтобы отделить найденный вами адрес YouTube и вернуть его в нужный вам формат?Затем вы можете упростить свое регулярное выражение, чтобы оно только находило весь URL, а затем использовать urlparse, чтобы сделать тяжелую работу по его выделению.

from urlparse import urlparse,parse_qs,urlunparse
from urllib import urlencode
youtube_url = urlparse('http://www.youtube.com/watch?v=aFNzk7TVUeY&feature=grec_index')
params = parse_qs(youtube_url.query)
new_params = {'v': params['v'][0]}

cleaned_youtube_url = urlunparse((youtube_url.scheme, \
                                  youtube_url.netloc, \
                                  youtube_url.path,
                                  None, \
                                  urlencode(new_params), \
                                  youtube_url.fragment))

Это немного больше кода, но он позволяет вамизбегайте безумия регулярных выражений.

И, как сказал хоп, вы должны использовать необработанные строки для регулярных выражений.

0 голосов
/ 31 мая 2015

Вот как я реализовал это в моем скрипте:

string = "Hey, check out this video: https://www.youtube.com/watch?v=bS5P_LAqiVg"

youtube = re.findall(r'(https?://)?(www\.)?((youtube\.(com))/watch\?v=([-\w]+)|youtu\.be/([-\w]+))', string)

if youtube:
    print youtube

Это выводит:

["", "youtube.com/watch?v=BS5P_LAqiVg", ".com", "watch", "com", "bS5P_LAqiVg", ""]

Если вы просто хотите получить идентификатор видео, например, вы должны сделать:

video_id = [c for c in youtube[0] if c] # Get rid of empty list objects
video_id = video_id[len(video_id)-1] # Return the last item in the list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...