Какой код можно использовать для парсинга изображений с сайта <a href="https://new-science.ru/?s=%D0%B3%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5+%D0%BF%D0%BE%D1%82%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5" rel="nofollow">https://new-science.ru/?s=глобальное+потепление</a>, где изображения находятся внутри тега с другим тегом, содержащим атрибут scrset, с необходимыми ссылками? Вот мой текущий код: <br/> <br/> ```python <br/> from flask import Flask, render_template <br/> import requests <br/> from bs4 import BeautifulSoup <br/> <br/> app = Flask(__name__) <br/> <br/> def fetch_articles_with_images(): <br/> url = 'https://new-science.ru/?s=глобальное+потепление' <br/> headers = { <br/> "User-Agent": "Mozilla/5.0" <br/> } <br/> <br/> articles = [] <br/> response = requests.get(url, headers=headers) <br/> soup = BeautifulSoup(response.text, "lxml") <br/> <br/> posts = soup.find_all('div', class_='post-details') <br/> <br/> for post in posts: <br/> title_tag = post.find('h2', class_='post-title') <br/> title = title_tag.text.strip() if title_tag else "No Title" <br/> link = title_tag.find('a')['href'] if title_tag and title_tag.find('a') else "No Link" <br/> views_tag = post.find('span', class_='meta-views meta-item') <br/> views = views_tag.text.strip() if views_tag else "No Views" <br/> date_tag = post.find('span', class_='date meta-item tie-icon') <br/> date = date_tag.text.strip() if date_tag else "No Date" <br/> <br/> # Поиск изображения в теге <br/> image_url = None <br/> pic```
Для того чтобы извлечь ссылки на изображения с сайта, вам нужно убедиться, что вы правильно получаете соответствующие теги, и в частности — атрибут `srcset`, который может содержать ссылки на изображения. Давайте доработаем ваш код, добавив извлечение изображений из нужного тега. Вот полный пример кода с учетом вашего запроса: ```python from flask import Flask, render_template import requests from bs4 import BeautifulSoup app = Flask(__name__) def fetch_articles_with_images(): url = 'https://new-science.ru/?s=глобальное+потепление' headers = { "User-Agent": "Mozilla/5.0" } articles = [] response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, "lxml") posts = soup.find_all('div', class_='post-details') for post in posts: title_tag = post.find('h2', class_='post-title') title = title_tag.text.strip() if title_tag else "No Title" link = title_tag.find('a')['href'] if title_tag and title_tag.find('a') else "No Link" views_tag = post.find('span', class_='meta-views meta-item') views = views_tag.text.strip() if views_tag else "No Views" date_tag = post.find('span', class_='date meta-item tie-icon') date = date_tag.text.strip() if date_tag else "No Date" # Поиск изображения в теге image_url = None img_tag = post.find('img') if img_tag: # Проверка наличия атрибута srcset srcset = img_tag.get('srcset') if srcset: # Извлечение первого изображения из srcset image_url = srcset.split(',')[0].split(' ')[0] # берем первую часть srcset articles.append({ 'title': title, 'link': link, 'views': views, 'date': date, 'image_url': image_url }) return articles @app.route('/') def index(): articles = fetch_articles_with_images() return render_template('index.html', articles=articles) if __name__ == '__main__': app.run(debug=True) ``` ### Важные моменты: 1. **Извлечение изображения**: В этом коде мы ищем тег `<img>` внутри каждого поста. Затем проверяем наличие атрибута `srcset`. Если он есть, мы берем первую ссылку на изображение. 2. **Парсинг srcset**: Значение атрибута `srcset` обычно содержит несколько URL, разделенных запятыми, и мы берем первую ссылку перед пробелом. 3. **Обработка отсутствующих данных**: Убедитесь, что вы обрабатываете случаи, когда изображения или другие элементы могут отсутствовать, чтобы избежать ошибок. Теперь, запустив ваш Flask-приложение, вы сможете извлечь названия статей, ссылки, количество просмотров, дату и ссылки на изображения, если они доступны.
Не нужно ничего там парсить, сайт предоставляет официальный механизм для автоматизации - rss
https://new-science.ru/search/%D0%B3%D0%BB%D0%BE%D...
<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" > <channel> <title>Вы искали глобальное потепление | New-Science.ru</title> <atom:link href="https://new-science.ru/search/%D0%B3%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5+%D0%BF%D0%BE%D1%82%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5/feed/rss2/" rel="self" type="applica tion/rss+xml" /> <link>https://new-science.ru</link> <description>Актуальные новости научных открытий, высоких технологий, электроники и космоса.</description> <lastBuildDate>Sat, 05 Apr 2025 17:04:46 +0000</lastBuildDate> <language>ru-RU</language> <sy:updatePeriod> hourly </sy:updatePeriod> <sy:updateFrequency> 1 </sy:updateFrequency> <generator>https://wordpress.org/?v=6.7.2</generator> <image> <url>https://new-science.ru/wp-content/uploads/2019/08/favicon.png</url> <title>Вы искали глобальное потепление | New-Science.ru</title> <link>https://new-science.ru</link> <width>32</width> <height>32</height> </image> ... <item> <title>Атмосферные реки мигрируют к полюсам, изменяя климат планеты</title> <link>https://new-science.ru/atmosfernye-reki-migrirujut-k-poljusam-izmenyaya-klimat-planety/</link> <dc:creator><![CDATA[New-Science.ru]]></dc:creator> <pubDate>Wed, 27 Nov 2024 07:20:47 +0000</pubDate> <category><![CDATA[Природа]]></category> <guid isPermaLink="false">https://new-science.ru/?p=47504</guid> <description><![CDATA[<img width="1200" height="525" src="https://new-science.ru/wp-content/uploads/2024/11/865-6.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" st yle="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" loading="lazy" srcset="https://new-science.ru/wp-content/uploads/2024/11/865-6.jpg 1200w, https://new-scienc e.ru/wp-content/uploads/2024/11/865-6-768x336.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" />Атмосферные реки, мощные потоки водяного пара, взвешенного в атмосфере, уже несколько десятилетий движутся неожиданным образом, изменяя характер осадков и климат в глобальном масштабе. Что такое атмосферная река? Атмосферные реки — это огромные потоки водяного пара, которые циркулируют в атмосфере и переносят количеств о влаги, сравнимое с крупнейшими реками на Земле, такими как Миссисипи. Эти небесные реки …]]></description> </item> </channel> </rss>
Если необходим получить ссылку на .webp - файл из атрибута srcset тега source :
img_url = figure.find('source')['srcset']
К примеру код, который извлекает ссылку на картинку и скачивает файл с изображением с указанного вами сайта.
from bs4 import BeautifulSoup import requests import fake_useragent import os ua = fake_useragent.UserAgent() headers = {"User-Agent": ua.random} url = 'https://new-science.ru/rasseivanie-almaznyh-nanochastic-v-stratosfere-mozhet-zamedlit-globalnoe-poteplenie/' def get_files(link, folder='images'): resp = requests.get(link, stream=True) filename = os.path.basename(link) if not os.path.isdir(folder): os.mkdir(folder) file = open(f"{folder}/{filename}", 'bw') for chunk in resp.iter_content(4096): file.write(chunk) return filename response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') figure = soup.find('figure', class_ ="single-featured-image") #img_url = figure.find('img')['src'] img_url = figure.find('source')['srcset'] get_files(img_url, 'images') print(img_url)