youtube-dl
имеет в своем ДОПОЛНИТЕЛЬНАЯ документация
description = self._search_regex(
r'<span[^>]+id = "title"[^>]*>([^<]+)<',
webpage, 'description', fatal=False)
Какие параметры у _search_regex
? В документации не указано, что такое 'description'
? Это атрибут HTML?
Так это просто название сообщения об ошибке? @AlexanderReynolds
Как внутренняя функция (начинается с подчеркивания), она плохо документирована, но вы можете найти его определение в исходном коде.
_search_regex
- это служебная функция, которая в основном вызывает re.search
, но унифицирует обработку в случае, если регулярное выражение не совпадает. Это важно, поскольку многие экстракторы используют регулярные выражения, и было бы утомительно (не говоря уже о большом дублировании кода) реплицировать обработку ошибок повсюду.
Вот его параметры:
pattern
: ищется регулярное выражение. Например, что-то вроде r'(?:foo|href)\s*=\s*(http://[^"]*)"
. Обычно первая захваченная группа (т.е. материал в скобках, но не начинающийся с ?:
. Для получения дополнительной информации о регулярных выражениях обратитесь к Документация стандартной библиотеки Python.string
: строка для поиска (например, стог сена), загруженная из службы, к которой вы подключаетесь.name
: Имя, которое вы выбрали; это предоставляется пользователю, если что-то не удается. Должен быть уникальным для вашего экстрактора. Примерами являются 'manifest URL'
или 'content section'
. Таким образом, вы сразу узнаете, в чем проблема, если пользователь отправит сообщение об ошибке без трассировки стека.default=NO_DEFAULT
: значение по умолчанию. Иногда используется значение по умолчанию, если регулярное выражение не совпадает. Если да, то передайте его сюда.fatal=True
: Если значение по умолчанию не указано, это определяет поведение, если регулярное выражение не соответствует. True
: прервать извлечение и выдать подробную ошибку; например, если не удается извлечь URL-адрес видео. False
: Только пропустите предупреждение и продолжайте; если поиск необязательного поля (например, описания) не удался.flags=0
- Явные флаги регулярного выражения. Редко используемый; см. Документация стандартной библиотеки Python для получения дополнительной информации.group=None
- Соответствует другой группе, кроме первой. Редко используется, имеет смысл только в том случае, если ваше регулярное выражение содержит именованные группы. Обратитесь к Документация стандартной библиотеки Python (ключевое слово названные группы) для получения более подробной информации.отличный ответ, после того, как был найден исходный код, стало довольно ясно, что происходит. это довольно странный параметр и довольно причудливая структура проекта. черт возьми, это даже довольно странно, что они поощряют синтаксический анализ html с помощью регулярных выражений
Как тот, кто написал этот код, меня, конечно, интересует, почему вы считаете его странным. Что конкретно вы бы изменили? В вашем экстракторе вы можете вместо этого использовать правильный XML-парсер, но не многие веб-сайты последовательно выводят правильно сформированный XML или даже HTML. Единственное ограничение - вы не можете использовать библиотеки вне стандартной библиотеки Python 2.7+. Это преднамеренный компромисс между удобством пользователя и удобством разработчика, и, на мой взгляд, в является основной причиной успеха youtube-dl над «конкурирующими» проектами.
Я бы предпочел что-то вроде абстракции jquery / css над HTML-регулярным выражением (которым, как я полагаю, является pyquery
)?
Похоже, что такой проект лучше всего подходит для node / rx.js, где у вас есть доступ к dom и вы можете запускать безголовый режим. Регулярное выражение кажется хрупким и более трудоемким, .attr('href')
может легко определить имя для сообщения об ошибке: "[Extractor: %s] Asserts attribute %s be present, and it's not on line %s"
. Это также больше, чем я привык, когда разбираю HTML, и chrome-dev-toolkit сгенерирует для меня css-селекторы. (хотя с регулярными выражениями проблем нет, я просто не вижу причин выполнять больше работы для получения более хрупкого результата).
Номера строк бесполезны, поскольку они время от времени меняются и могут вводить в заблуждение; многие пользователи youtube-dl сообщают только небольшую часть фактического сообщения об ошибке, несмотря на инструкции в самом сообщении об ошибке сообщать обо всем. Но да, я согласен, было бы здорово иметь парсер HTML и механизм выбора запросов CSS! Увы, приходится работать с имеющимися инструментами. Если вы готовы предоставить код для синтаксического анализа HTML и селекторов запросов CSS в youtube-dl - или в стандартную библиотеку Python - я уверен, что все будут очень довольны.
FWIW фактическое определение функции можно найти здесь: github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/…