У меня возникли проблемы с извлечением ссылки на фото с сайта. Можете помочь?

Какой код можно использовать для парсинга изображений с сайта <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```
  • 7 апреля 2025 г. 12:25
Ответы на вопрос 3
Для того чтобы извлечь ссылки на изображения с сайта, вам нужно убедиться, что вы правильно получаете соответствующие теги, и в частности — атрибут `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" />Атмосферные реки, мощные потоки водяного пара, взвешенного в атмосфере, уже несколько десятилетий движутся
неожиданным образом, изменяя характер осадков и климат в глобальном масштабе. Что такое атмосферная река? Атмосферные реки — это огромные потоки водяного пара, которые циркулируют в атмосфере и переносят количеств
о влаги, сравнимое с крупнейшими реками на Земле, такими как Миссисипи. Эти небесные реки &#8230;]]></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)
Похожие вопросы