не получается задать css selector BeautifulSoup (Python)
Нужно по заданной категории на Flickr загрузить все найденные изображения на жесткий диск. Не получается разобраться с конструкцией CSS селектора
import requests, bs4
res = requests.get('https://www.flickr.com/search/?text=cats')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, features="html.parser")
flickrElem = soup.select('.interaction-view')
print(flickrElem)
вот в таком варианте кода, он находит все div. Но ссылки хранятся в тэге a во вложенном div. И по идеи CSS селектор должен иметь вид
flickrElem = soup.select('.interaction-view div a')
но при этом список получается пустым
Ответы (1 шт):
Отключил выполнение javascript через инспектор браузера, на странице нет тегов по тому пути, но картинки, кст, остались. Вам или парсить то, что есть (сделаю пример по этому варианту), или использовать парсер с движком на javascript (типа selenium)
Парсер bs4 не умеет работать с javascript'ом, поэтому отключив его на странице мы сможешь увидеть страницу, которую и пытаемся парсить:
В ней есть ссылки на превью картинок, скрытые в атрибуте style. Чтобы извлечь его нужно:
- Перебирать элементы с атрибутом
style - Из атрибута
styleискать ссылки на картинки (re.search) - Из относительной ссылки сделать абсолютную (
urljoin)
Пример:
import re
from urllib.parse import urljoin
import requests
from bs4 import BeautifulSoup
rs = requests.get('https://www.flickr.com/search/?text=cats')
root = BeautifulSoup(rs.content, 'html.parser')
for x in root.select('.view.photo-list-photo-view[style]'):
m = re.search(r'url\((.+?)\)', x['style'])
url_img = urljoin(rs.url, m.group(1))
print(url_img)
Результат:
https://live.staticflickr.com/5598/14934282524_344c84246b_n.jpg
https://live.staticflickr.com/4838/45925416992_c9caac8cb9_m.jpg
https://live.staticflickr.com/4536/38465451442_59291a4a2f_n.jpg
...
https://live.staticflickr.com/267/31671889412_bb37b917be_n.jpg
https://live.staticflickr.com/70/175237265_029f7974a2_w.jpg
https://live.staticflickr.com/3488/4051998735_5b4863ac11_m.jpg
https://live.staticflickr.com/5036/5881933297_7974eaff82_n.jpg
