2016-04-29 2 views
-2

Я пытаюсь извлечь URL из списка строк. Пример списка:Python Regex над списком строк

import re 
p = ['<img class="alignnone size-full wp-image-2087" src="http://www.sample.com/test.jpg" alt="0wCR41v" width="540" height="720" srcset="http://www.sample.com/test-225x300.jpg 225w, http://www.sample.com/test.jpg 540w" sizes="(max-width: 540px) 100vw, 540px" />', '<img class="alignnone size-large wp-image-2133" src="http://www.sample.com/test2.jpg" alt="NtAboHF" width="583" height="1024" srcset="http://www.happyfridaygents.com/wp-content/uploads/2016/04/NtAboHF-768x1349.jpg 768w, http://www.sample.com/test2.jpg 583w, http://www.happyfridaygents.com/wp-content/uploads/2016/04/NtAboHF.jpg 828w" sizes="(max-width: 583px) 100vw, 583px" />'] 

Я хотел бы, чтобы извлечь http://www.sample.com/test.jpg часть, которая приходит сразу после SRC =»часть

я могу использовать FindAll если р только одна строка примерно так:.

t = re.findall('src="(.+)" alt', p) 
print t 

Но как я могу пройти по списку и возвращает список всех URL-адресов в P?

+0

См http://www.cademuir.eu/blog/2011/10/20/python-searching-for-a-string-within- a-list-list-comprehension/ –

ответ

0

Это решение с использованием BeautifulSoup :

>>> p = ['<img class="alignnone size-full wp-image-2087" src="http://www.sample.com/test.jpg" alt="0wCR41v" width="540" height="720" srcset="http://www.sample.com/test-225x300.jpg 225w, http://www.sample.com/test.jpg 540w" sizes="(max-width: 540px) 100vw, 540px" />', '<img class="alignnone size-large wp-image-2133" src="http://www.sample.com/test2.jpg" alt="NtAboHF" width="583" height="1024" srcset="http://www.happyfridaygents.com/wp-content/uploads/2016/04/NtAboHF-768x1349.jpg 768w, http://www.sample.com/test2.jpg 583w, http://www.happyfridaygents.com/wp-content/uploads/2016/04/NtAboHF.jpg 828w" sizes="(max-width: 583px) 100vw, 583px" />'] 

>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup(''.join(p), 'html.parser') 
>>> src_links = [img['src'] for img in soup.find_all('img')] 

>>> src_links 
[u'http://www.sample.com/test.jpg', u'http://www.sample.com/test2.jpg'] 

Если вы хотите использовать регулярные выражения:

>>> regex = re.compile(r'src="(.+)" alt') 
>>> [regex.search(img).group(1) for img in p] 
['http://www.sample.com/test.jpg', 'http://www.sample.com/test2.jpg'] 
+1

Спасибо. Я использовал версию регулярного выражения. – Bernardo

0

ли это делать то, что вы хотите?

import re 
p = ['<img class="alignnone size-full wp-image-2087" src="http://www.sample.com/test.jpg" alt="0wCR41v" width="540" height="720" srcset="http://www.sample.com/test-225x300.jpg 225w, http://www.sample.com/test.jpg 540w" sizes="(max-width: 540px) 100vw, 540px" />', '<img class="alignnone size-large wp-image-2133" src="http://www.sample.com/test2.jpg" alt="NtAboHF" width="583" height="1024" srcset="http://www.happyfridaygents.com/wp-content/uploads/2016/04/NtAboHF-768x1349.jpg 768w, http://www.sample.com/test2.jpg 583w, http://www.happyfridaygents.com/wp-content/uploads/2016/04/NtAboHF.jpg 828w" sizes="(max-width: 583px) 100vw, 583px" />'] 
outList = [re.findall('src="(.+)" alt', pp)[0] for pp in p] 
+0

Мне было всего 4 минуты. :) – rocksteady

+0

Не уверен, что это предназначено, но это возвращает один список, но каждый элемент (url) - это сам список. Это правильно? – Bernardo

+0

Верно, я отредактировал ответ так, чтобы каждый элемент был просто строкой, а не списком. – Peter

0

Используйте список понимание:

l = [re.findall('src="(.+)" alt', each_url) for each_url in p] 

Это даст вам список списков, которые вы можете цепи вместе:

import itertools 
urls = list(itertools.chain(*l)) 

Регулярное выражение Ответ дается в другом месте более изящен, хотя.

+0

То же самое касается и Питера. «Не уверен, что это предназначено, но это возвращает один список, но каждый элемент (url) - это сам список. Правильно?» – Bernardo

+0

@Bernardo Я изменил код, чтобы вернуть список URL-адресов, но я предлагаю идти с регулярным выражением. – trans1st0r

+0

Спасибо. Я проверю это, когда вернусь домой. – Bernardo

0

Что делать это в цикле:

>>> pe = re.compile('src="(.+)" alt') 
>>> for img in p: 
...  print pe.findall(img) 
... 
['http://www.sample.com/test.jpg'] 
['http://www.sample.com/test2.jpg'] 
0
for i in p: 
    t = re.findall('src="(.+)" alt', i) 
    print t 

Update:

k=[re.findall('src="(.+)" alt',i) for i in p] 
[item for sublist in k for item in sublist] 

[ 'http://www.sample.com/test.jpg', 'http://www.sample.com/test2.jpg']

+0

Спасибо, но это печатает два списка. Я ищу один список URL-адресов. Думаю, я мог бы присоединиться к ним. – Bernardo

+0

проверить обновление, я думаю, что все в порядке. – bhansa

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