Необработанные строки Python и разбор HTML

1

Как работают строки python raw и строковые литералы? Я пытаюсь сделать webscraper для загрузки PDF файлов с сайта. Когда я ищу строку, она работает, но когда я пытаюсь реализовать ее в python, я всегда получаю None как мой ответ

import urllib
import re    
url="" //insert url here
sock=urllib.urlopen(url)
htmlSource=sock.read();
sock.close();

m=re.match(r"<a href.*?pdf[^>]*?", raw(htmlSource))
print m



$ python temp.py
None

Исходная функция отсюда: http://code.activestate.com/recipes/65211-convert-a-string-into-a-raw-string/

Тем не менее, как я могу завершить эту программу, чтобы я мог распечатать все совпадения, а затем загрузить pdf файлы?

Благодарю!

  • 7
    По какой-то причине вы используете регулярное выражение вместо реального анализатора HTML ?
  • 0
    часть этого также просто упражнение в регулярных выражениях для меня
Показать ещё 6 комментариев
Теги:

2 ответа

4
Лучший ответ

Вы, кажется, очень смущены.

Строковый литерал - это строка, которую вы вводите в программу. Поскольку должно быть четкое начало и конец вашей строки, некоторым символам становится неудобно находиться внутри середины строки, а escape-последовательности должны использоваться для их представления.

Python предлагает "сырые" строковые литералы, которые имеют разные правила для интерпретации escape-последовательностей: одни и те же правила используются, чтобы выяснить, где заканчивается строка (так что один обратный слэш, за которым следует начальный символ кавычки, не завершает строку), но тогда материал между обратными косыми чертами не преобразуется. Итак, в то время как '\'' - это строка, состоящая из одного символа кавычки (\' посередине" является escape-последовательность, которая создает цитату), r'\'' - это строка, состоящая из обратной косой черты и цитаты персонаж.

Исходный строковый литерал создает объект типа str. Это тот же тип, что и обычный строковый литерал. Они часто используются для шаблона для операции с регулярным выражением, потому что строки, используемые для регулярных выражений, часто должны содержать много обратных косых черт. Если вы хотите написать регулярное выражение, которое соответствовало обратному косую черту в исходном тексте, и у вас не было исходных строковых литералов, вам нужно было бы поставить, возможно, удивительно четыре обратных слэша между кавычками в вашем исходном коде: компилятор Python интерпретируйте это как строку, содержащую две настоящие обратные косые черты, которые, в свою очередь, представляют "совпадение обратной косой черты" в синтаксисе regex.

Функция, которую вы обнаружили, является несовершенной попыткой повторно ввести escape-последовательности во входной текст. Это не то, что вы хотите сделать, даже не имеет смысла, и в любом случае не соответствует авторской спецификации. Кажется, это основано на неправильном представлении, аналогичном вашему собственному. Концепция "необработанного эквивалента" строки бессмысленна. На самом деле нет такой вещи, как "сырая строка"; Необработанные строковые литералы - удобство для создания обычных строк.

Вы хотите найти шаблон в htmlSource. Он уже находится в том виде, в котором он вам нужен. Ваша проблема не имеет ничего общего со строковыми экранами. Когда строка поступает от ввода пользователем, ввода файла или в основном ничего, кроме источника программы, он не обрабатывается, как строковые литералы, если вы явно не разрешаете это. Если веб-страница содержит обратную косую черту, за которой следует n, строка, которая считывается urllib содержит в соответствующем месте именно это - обратную косую черту, за которой следует n, а не urllib строка.

Проблема заключается в следующем: вы хотите искать строку, как вы сказали: "когда я ищу строку, в которой она работает". В настоящее время вы соответствуете строке. См. Документацию:

Help on function match in module re:

match(pattern, string, flags=0)
    Try to apply the pattern at the start of the string, returning
    a match object, or None if no match was found.

Ваш шаблон не отображается в начале строки, так как HTML для веб-страницы не начинается с тэга <a> вы ищете.

Вы хотите m=re.search(r"<a href.*?pdf[^>]*?", htmlSource).

1

Проверьте этот ответ. Похоже, что Pythons urllib намного менее urllib для пользователей - и Unicode-friendly - чем он должен быть. Кажется, это заставляет вас иметь дело с уродливым сырым байтом, а не расшифровывать его для нормальной строки.

  • 0
    Проблема OP, по- видимому, не связана с Unicode, хотя это, безусловно, может вызвать дальнейшие проблемы в будущем. По крайней мере, в 2.x Python с радостью воспринимает «уродливое сырое содержимое байтов» как строку. Это не так плохо, как попытка разобрать HTML с помощью регулярного выражения;) и очевидная путаница OP с «необработанными строками» является гораздо более важной проблемой IMO. ( r'' не является антонимом для вас u'' .)
  • 0
    @ tchrist Я думал, что вы сказали "Единорог дружественный", и был взволнован: /

Ещё вопросы

Сообщество Overcoder
Наверх
Меню