Задать вопрос
@alexbaw09

У меня не получается спарсить ссылку на фото с сайта, help?

Сайт для парсинга: https://new-https://new-science.ru/?s=%D0%B3%D0%BB... (фото находится в теге в котором еще тег в котором атрибут scrset="ссылки которые мне нужны"

мой код:
from flask import Flask, render_template
import requests
from bs4 import BeautifulSoup

app = Flask(__name__)

import requests
from bs4 import BeautifulSoup

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"

        # Поиск изображения в теге <picture>
        image_url = None
        picture_tag = post.find('picture')
        if picture_tag:
            source_tag = picture_tag.find('source')
            if source_tag and 'srcset' in source_tag.attrs:
                image_url = source_tag['srcset'].split(',')[0].strip()  # Берем первую ссылку из srcset

        articles.append({
            'title': title,
            'link': link,
            'views': views,
            'date': date,
            'image': image_url
        })

    return articles


       


@app.route('/')
def home():
    return render_template('index.html')

@app.route('/articles')
def articles():
    articles = fetch_articles_with_images()
    print(articles)  # Посмотрите на вывод статей
    return render_template('articles.html', articles=articles)

if __name__ == '__main__':
    app.run(debug=True)
  • Вопрос задан
  • 186 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
@rPman
Не нужно ничего там парсить, сайт предоставляет официальный механизм для автоматизации - 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)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы