Я собираю страницу с деталями продукта текст на 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
Пояснение:
-
Извлечение всех тегов
<span>
: Вместоpd.find("span").string.strip()
, мы используемdetail_div.find_all("span")
, чтобы найти все<span>
в родительском<div>
. -
Объединение текста: Мы используем генератор списков, чтобы пройтись по каждому найденному
<span>
, и дважды проверяем, что строка существует (if span.string
). С помощью методаjoin
мы объединяем текст из каждого<span>
с разделителем, чтобы получить текст в горизонтальном виде. - Обработка ошибок: В случае если элемент не найден, возвращаем пустую строку.
Теперь, если вы вызовете 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.