У меня есть ссылка, и в этой ссылке у меня есть некоторые продукты. В каждом из этих продуктов есть таблица спецификаций. Таблица такова, что первый столбец должен быть заголовком, а второй столбец - соответствующими ему данными. Первый столбец для каждой из этих таблиц отличается, с некоторыми перекрывающимися категориями. Я хочу получить одну большую таблицу, в которой есть все эти категории, а в строках - разные продукты. Я могу получить данные для одной таблицы (одного продукта) следующим образом:
import requests
import pandas as pd
import xlsxwriter
import csv
from lxml import html
from bs4 import BeautifulSoup
url= "https://www.1800cpap.com/resmed-airfit-n30-nasal-cpap-mask-with-headgear"
source_code= requests.get(url)
plain_text= source_code.text
soup= BeautifulSoup(plain_text, 'html.parser')
table= soup.find("table", {"class":"table"})
print(table)
output_rows=[]
table_rows= table.find_all('tr')
#print(table_rows)
headers = [td.text for td in soup.select_one('.table').select('td:nth-of-type(1)')]
with open("data.csv", "w", encoding="utf-8-sig", newline='') as csv_file:
w = csv.writer(csv_file, delimiter = ",", quoting=csv.QUOTE_MINIMAL)
w.writerow(headers)
for table in soup.select('table'):
w.writerow([td.text for td in table.select('td:nth-of-type(2)')])
Я понимаю, что для разных продуктов мне придется переходить по ссылке на каждый продукт, и я могу это сделать. Однако как мне добавить каждую таблицу к предыдущему выводу, чтобы сохранить требуемую структуру таблицы?
2 ответа
import requests
import pandas as pd
from bs4 import BeautifulSoup
url = 'https://www.1800cpap.com/cpap-masks/nasal'
def get_item(url):
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
print('Getting {}..'.format(url))
title = soup.select_one('h1.product-details-full-content-header-title').get_text(strip=True)
all_data = {'Item Title': title}
for tr in soup.select('#product-specs-list tr'):
h, v = [td.get_text(strip=True) for td in tr.select('td')]
all_data[h.rstrip(':')] = v
return all_data
all_data = []
for page in range(1, 2):
print('Page {}...'.format(page))
soup = BeautifulSoup(requests.get(url, params={'page': page}).content, 'html.parser')
for a in soup.select('a.facets-item-cell-grid-title'):
u = 'https://www.1800cpap.com' + a['href']
all_data.append(get_item(u))
df = pd.DataFrame(all_data)
df.to_csv('data.csv')
Печать:
Page 1...
Getting https://www.1800cpap.com/resmed-airfit-n30-nasal-cpap-mask-with-headgear..
Getting https://www.1800cpap.com/dreamwear-nasal-cpap-mask-with-headgear-by-philips-respironics..
Getting https://www.1800cpap.com/eson-2-nasal-cpap-mask-with-headgear-by-fisher-and-paykel..
Getting https://www.1800cpap.com/resmed-mirage-fx-nasal-cpap-mask..
Getting https://www.1800cpap.com/airfit-n30i-nasal-cpap-mask-by-resmed..
Getting https://www.1800cpap.com/dreamwisp-nasal-cpap-mask-fitpack..
Getting https://www.1800cpap.com/respironics-comfortgel-blue-cpap-nasal-mask-with-headgear..
Getting https://www.1800cpap.com/resmed-mirage-fx-for-her-nasal-cpap-mask..
Getting https://www.1800cpap.com/airfit-n20-nasal-cpap-mask-with-headgear..
Getting https://www.1800cpap.com/wisp-nasal-cpap-mask-with-headgear..
Getting https://www.1800cpap.com/pico-nasal-cpap-mask-with-headgear-by-philips-respironics-2..
Getting https://www.1800cpap.com/airfit-n20-for-her-nasal-cpap-mask-with-headgear..
Getting https://www.1800cpap.com/airfit-f10-nasal-cpap-mask-with-headgear..
Getting https://www.1800cpap.com/fisher-and-paykel-zest-q-nasal-mask-with-headgear..
Getting https://www.1800cpap.com/resmed-swift-fx-nano-nasal-cpap-mask-with-headgear..
Getting https://www.1800cpap.com/resmed-ultra-mirage-2-nasal-cpap-mask..
Getting https://www.1800cpap.com/airfit-n10-for-her-nasal-cpap-mask-with-headgear..
Getting https://www.1800cpap.com/eson-nasal-cpap-mask-by-fisher-and-paykel..
Getting https://www.1800cpap.com/resmed-swift-fx-nano-nasal-cpap-mask-for-her-with-headgear..
Getting https://www.1800cpap.com/mirage-activa-lt-cpap-mask-by-resmed..
Getting https://www.1800cpap.com/resmed-mirage-micro-cpap-mask..
Getting https://www.1800cpap.com/phillips-respironics-trueblue-nasal-cpap-mask-with-headgear..
Getting https://www.1800cpap.com/fisher-paykel-zest-cpap-mask..
Getting https://www.1800cpap.com/viva-nasal-cpap-mask-by-3b-medical..
И сохраняет data.csv
(скриншот из LibreOffice):
Вы можете проверить аналогичный код здесь < / а>
Вы можете хранить все заголовки внутри списка headers
, и если заданное значение заголовка существует внутри списка headers
, поместите сведения о продукте в строку в соответствии с индексами столбцов, которые вы нашли в списке headers
Например, этот скреппер результата
# row[1] contains all subjects and row[2] contains marks
for j in range (row[1].__len__()):
if(row[1][j] in subjets):
index = subjets.index(row[1][j])
# + 5 because i started subjet's names from 5th column
# if this subject name is inside list then
# it will put row value according to subject's index inside list subjets.
worksheet.write(x, index+5, row[2][j])
else:
# if any subject name is not inside my list then
# i can append that column value to the list
subjets.append(row[1][j])
worksheet.write(0, csub , row[1][j])
worksheet.write(x, csub, row[2][j])
csub=csub+1
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.