Не удается получить все теги span внутри элемента div с помощью BeautifulSoup

Вопросы и ответы

Я собираю страницу с деталями продукта текст на Amazon, но возвращаемые данные формируются в виде маркированного списка. Я хочу, чтобы данные были добавлены как колонка рядом с другими собранными данными.

экспорт в csv
Детали продукта Amazon

Часть кода, которая работает

def get_availability(soup):
try:
    available = soup.find("div", attrs={'id':'availability'})
    available = available.find("span").string.strip()

except AttributeError:
    available = "Нет в наличии" 

return available

Я создал аналогичную часть кода, как выше, но это не работает, как ожидается

# Функция для извлечения деталей продукта
def get_pd(soup):
    try:
        pd = soup.find("div", attrs={'id':'detailBullets_feature_div'}).text.strip()
        pd = pd.find("span").string.strip()

    except AttributeError:
        pd = ""

    return pd

Когда я удаляю эту часть кода

 pd = pd.find("span").string.strip()

Я получаю маркированный список, но результат не соответствует моим ожиданиям. Результат должен быть размещён рядом друг с другом, а не вертикально.

Ответ

Для решения проблемы с извлечением всех тегов <span> внутри элемента <div> с использованием библиотеки BeautifulSoup, необходимо внести несколько изменений в вашу функцию get_pd. Прежде всего, ваша текущая функция пытается выдать строку с содержимым первого <span>, но вместо этого вам нужно собрать текст из всех <span>, находящихся внутри заданного <div>, и затем объединить их в строку.

Вот исправленная версия функции get_pd, которая решает вашу задачу:

from bs4 import BeautifulSoup
import requests

def get_pd(soup):
    try:
        # Находим нужный <div> по ID
        detail_div = soup.find("div", attrs={'id': 'detailBullets_feature_div'})

        # Извлекаем все <span> внутри найденного <div>
        spans = detail_div.find_all("span")

        # Извлекаем текст из каждого <span> и объединяем их
        pd = ' | '.join(span.string.strip() for span in spans if span.string)  # Используем '|' для разделения текстов

    except AttributeError:
        pd = ""

    return pd

Пояснение:

  1. Извлечение всех тегов <span>: Вместо pd.find("span").string.strip(), мы используем detail_div.find_all("span"), чтобы найти все <span> в родительском <div>.

  2. Объединение текста: Мы используем генератор списков, чтобы пройтись по каждому найденному <span>, и дважды проверяем, что строка существует (if span.string). С помощью метода join мы объединяем текст из каждого <span> с разделителем, чтобы получить текст в горизонтальном виде.

  3. Обработка ошибок: В случае если элемент не найден, возвращаем пустую строку.

Теперь, если вы вызовете get_pd(soup), это должно вернуть текст из всех тегов <span> в указанном <div>, объединив их в одну строку, что позволит вам расположить данные в одной строке в вашем CSV.

Пример использования функции:

url = 'ваш_URL_страницы'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

product_details = get_pd(soup)
print(product_details)  # Выводит объединенный текст из <span>

Теперь вы сможете получить текст всех тегов <span> внутри нужного элемента и представить его как одну строку при экспорте в CSV.

Оцените материал
Добавить комментарий

Капча загружается...