2016-04-26 2 views
1

У меня есть переменная, как показано ниже:Используя регулярное выражение питона, чтобы найти путь к изображению

var = '<img src="path_1"><p>Words</p><img src="path_2>' 

Сво строку, но внутри явно HTML элементы. Как получить первый путь (т. Е. Path_1) с помощью регулярного выражения?

Я пытаюсь что-то вроде этого:

match = re.match(r'src=\"[\w-]+\"', var) 
print match.group(0) 

Я получаю эту ошибку:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'group' 

Любая помощь приветствуется.

+3

try 're.search()' – thebjorn

+0

'match' находит только с начала .. [' Если ноль или более символов в начале строки соответствуют шаблону регулярных выражений'] (https://docs.python.org /2/library/re.html#re.match) – rock321987

ответ

4

Вы should use an HTML parser как BeautifulSoup:

>>> from bs4 import BeautifulSoup 
>>> var = '<img src="path_1"><p>Words</p><img src="path_2>' 
>>> soup = BeautifulSoup(var, "html.parser") 
>>> soup.img["src"] 
'path_1' 

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

  • переключатель в re.search(), re.match() начинается соответствие от начало строки
  • добавить capturing group, чтобы захватить src значение
  • нет никакой необходимости, чтобы избежать двойных кавычек

Фиксированная версия:

>>> re.search(r'src="([\w-]+)"', var).group(1) 
'path_1' 
+2

Я бы сказал: вы *** должны использовать HTML-парсер –

+1

@PedroLobito определенно, внесли изменения и ссылались на знаменитый поток. Благодарю. – alecxe

+1

Ничего себе, я даже не знал, что это существовало. Это выглядит идеально. Большое спасибо! –

2

Как указывается в комментариях, используйте search() так match() будет пытаться соответствовать регулярному выражению с самого начала Струна. Вы можете также использовать захват с именем группы, чтобы сделать код более читаемым:

var = '<img src="path_1"><p>Words</p><img src="path_2>' 
import re 
match = re.search(r'src=\"(?P<path1>[\w-]+)\"', var) 
if match: 
    print(match.group('path1')) 

Выход:

path_1 
1

Try,

path1= re.search(r'<img\s+src="(.*?)"><p>',var).group(1) # path_1 
  1. BeutifulSoup удобно. Но очень медленно.

  2. HTMLParser намного быстрее. Но использовать это больно.

  3. re является возможность быстро и, на мой взгляд, для лиц без usecases это стоит.

Если целевой текст Stateful, то есть много вложенности и захват семантики важно, вместо того чтобы осуществлять государственную машину например анализатор использовать имеющийся анализатор. Я бы настоятельно предложил lxml для разбора HTML и XML.Это немного менее удобно, чем bs4, но сравнимо с re в скорости.

+0

Это слишком сильное утверждение, чтобы сказать, что 'BeautifulSoup'« очень медленный ». Вы можете настроить его для использования другого парсера под капотом: say 'lxml':' BeautifulSoup (data, "lxml") '. Или вы можете разобрать часть документа через 'SoupStrainer' и т. Д. – alecxe

+0

Мне это известно. Даже если вы используете 'lxml' под капотом, он медленнее, чем' re' на величину. Все объекты создания и поиска. –

Смежные вопросы