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

Какой код можно использовать для парсинга изображений с сайта <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 <br/> <a 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="nofollow">https://new-science.ru/search/%D0%B3%D0%BB%D0%BE%D...</a> <br/> <pre><code class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;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/"
        &gt;

&lt;channel&gt;
        &lt;title&gt;Вы искали глобальное потепление | New-Science.ru&lt;/title&gt;
        &lt;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" /&gt;
        &lt;link&gt;https://new-science.ru&lt;/link&gt;
        &lt;description&gt;Актуальные новости научных открытий, высоких технологий, электроники и космоса.&lt;/description&gt;
        &lt;lastBuildDate&gt;Sat, 05 Apr 2025 17:04:46 +0000&lt;/lastBuildDate&gt;
        &lt;language&gt;ru-RU&lt;/language&gt;
        &lt;sy:updatePeriod&gt;
        hourly  &lt;/sy:updatePeriod&gt;
        &lt;sy:updateFrequency&gt;
        1       &lt;/sy:updateFrequency&gt;
        &lt;generator&gt;https://wordpress.org/?v=6.7.2&lt;/generator&gt;

&lt;image&gt;
        &lt;url&gt;https://new-science.ru/wp-content/uploads/2019/08/favicon.png&lt;/url&gt;
        &lt;title&gt;Вы искали глобальное потепление | New-Science.ru&lt;/title&gt;
        &lt;link&gt;https://new-science.ru&lt;/link&gt;
        &lt;width&gt;32&lt;/width&gt;
        &lt;height&gt;32&lt;/height&gt;
&lt;/image&gt;
...
                &lt;item&gt;
                &lt;title&gt;Атмосферные реки мигрируют к полюсам, изменяя климат планеты&lt;/title&gt;
                &lt;link&gt;https://new-science.ru/atmosfernye-reki-migrirujut-k-poljusam-izmenyaya-klimat-planety/&lt;/link&gt;

                &lt;dc:creator&gt;&lt;![CDATA[New-Science.ru]]&gt;&lt;/dc:creator&gt;
                &lt;pubDate&gt;Wed, 27 Nov 2024 07:20:47 +0000&lt;/pubDate&gt;
                                &lt;category&gt;&lt;![CDATA[Природа]]&gt;&lt;/category&gt;
                &lt;guid isPermaLink="false"&gt;https://new-science.ru/?p=47504&lt;/guid&gt;

                                        &lt;description&gt;&lt;![CDATA[&lt;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" /&gt;Атмосферные реки, мощные потоки водяного пара, взвешенного в атмосфере, уже несколько десятилетий движутся
неожиданным образом, изменяя характер осадков и климат в глобальном масштабе. Что такое атмосферная река? Атмосферные реки — это огромные потоки водяного пара, которые циркулируют в атмосфере и переносят количеств
о влаги, сравнимое с крупнейшими реками на Земле, такими как Миссисипи. Эти небесные реки &amp;#8230;]]&gt;&lt;/description&gt;



                        &lt;/item&gt;
        &lt;/channel&gt;
&lt;/rss&gt;</code></pre>
Если необходим получить  ссылку на  .webp - файл из атрибута <b> srcset</b> тега <b>source</b> : <br/> <br/> <code class="python">img_url = figure.find('source')['srcset']</code> <br/> <br/> К примеру код, который извлекает ссылку на картинку и скачивает файл с изображением с указанного вами сайта. <br/> <br/> <pre><code class="python">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)</code></pre>
Похожие вопросы