Извлечение нескольких URL-адресов без тегов «a» или «href» с веб-страницы с помощью BS4

Я делаю простую программу с Selenium, которая переходит на Flickr.com, ищет введенный пользователем термин, а затем распечатывает URL-адреса всех этих изображений.

Я борюсь с последней частью, получая только URL-адреса изображений. Я использовал поиск class_=, чтобы получить часть HTML, где находятся URL-адреса. Это возвращает следующее несколько раз при поиске «яблок»:

<div class="view photo-list-photo-view requiredToShowOnServer awake" 
   data-view-signature="photo-list-photo-view__engagementModelName_photo-lite-
   models__excludePeople_false__id_6246270647__interactionViewName_photo-list-
   photo-interaction-    view__isOwner_false__layoutItem_1__measureAFT_true__model_1__modelParams_1_    _parentContainer_1__parentSignature_photolist-
   479__requiredToShowOnClient_true__requiredToShowOnServer_true__rowHeightMod    _1__searchTerm_apples__searchType_1__showAdvanced_true__showSort_true__show    Tools_true__sortMenuItems_1__unifiedSubviewParams_1__viewType_jst"
   style="transform: translate(823px, 970px); -webkit-transform:     translate(823px, 970px); -ms-transform: translate(823px, 970px); width:
   237px; height: 178px; background-image:
   url(//c3.staticflickr.com/7/6114/6246270647_edc7387cfc_m.jpg)">
<div class="interaction-view"></div>

Все, что я хочу, это чтобы URL-адрес каждого изображения был таким:

c3.staticflickr.com/7/6114/6246270647_edc7387cfc_m.jpg

Поскольку нет тегов a или href, я изо всех сил пытаюсь их отфильтровать.

В конце я также попытался выполнить регулярное выражение, например следующее:

print(soup.find_all(re.compile(r'^url\.jpg$')))

Но это не сработало.

В любом случае, вот мой полный код ниже, спасибо.

import os
import re
import urllib.request as urllib2
import bs4
from selenium import webdriver
from selenium.webdriver.common.keys import Keys 

os.makedirs('My_images', exist_ok=True)

browser = webdriver.Chrome()
browser.implicitly_wait(10)

print("Opening Flickr.com")

siteChoice = 'http://www.flickr.com'

browser.get(siteChoice)

print("Enter your search term: ")

term = input("> ")

searchField = browser.find_element_by_id('search-field')
searchField.send_keys(term)
searchField.submit()

url = siteChoice + '/search/?text=' + term

html = urllib2.urlopen(url)

soup = bs4.BeautifulSoup(html, "html.parser")

print(soup.find_all(class_='view photo-list-photo-view requiredToShowOnServer awake', style = re.compile('staticflickr')))

мой измененный код:

p = re.compile(r'url\(\/\/([^\)]+)\)')

test_str = str(soup)

all_urls = re.findall(p, test_str)


print('Exporting to file')


with open('flickr_urls.txt', 'w') as f:
    for i in all_urls:
        f.writelines("%s\n" % i)

print('Done')

person easy_c0mpany80    schedule 10.03.2016    source источник


Ответы (2)


Попробуй это

url\(\/\/([^\)]+)\)

Демо

import re
p = re.compile(ur'url\(\/\/([^\)]+)\)')
test_str = u"<div class=\"view photo-list-photo-view requiredToShowOnServer awake\" \ndata-view-signature=\"photo-list-photo-view__engagementModelName_photo-lite-\nmodels__excludePeople_false__id_6246270647__interactionViewName_photo-list-\nphoto-interaction-    view__isOwner_false__layoutItem_1__measureAFT_true__model_1__modelParams_1_    _parentContainer_1__parentSignature_photolist-\n479__requiredToShowOnClient_true__requiredToShowOnServer_true__rowHeightMod    _1__searchTerm_apples__searchType_1__showAdvanced_true__showSort_true__show    Tools_true__sortMenuItems_1__unifiedSubviewParams_1__viewType_jst\"\n style=\"transform: translate(823px, 970px); -webkit-transform:     translate(823px, 970px); -ms-transform: translate(823px, 970px); width:\n 237px; height: 178px; background-image:\n url(//c3.staticflickr.com/7/6114/6246270647_edc7387cfc_m.jpg)\">\n<div class=\"interaction-view\"></div>"

m = re.search(p, test_str)
print m.group(1)

Выход:

c3.staticflickr.com/7/6114/6246270647_edc7387cfc_m.jpg
person Tim007    schedule 10.03.2016
comment
Спасибо, я вижу, как это захватит то, что мне нужно, но я не думаю, что сейчас правильно это реализую, должна ли последняя строка быть такой? print(soup.find_all(re.compile(r'url(\/\/([^)]+))'))) у меня не работает, боюсь - person easy_c0mpany80; 10.03.2016
comment
Благодарность! Я думаю, что это должно быть (р'урл.. а не (ур'урл... правильно? Я поместил свои изменения выше и все равно теперь отлично работает, еще раз спасибо - person easy_c0mpany80; 11.03.2016

Чтобы удалить все ссылки png/jpg со страницы с помощью Selenium:

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://www.flickr.com/")
links = driver.execute_script("return document.body.innerHTML.match(" \
  "/https?:\/\/[a-z_\/0-9\-\#=&.\@]+\.(jpg|png)/gi)")
print links
person Florent B.    schedule 10.03.2016