Как я могу получить одинаковую длину для всех атрибутов, а также правильную информацию по сравнению со страницей сведений. Хотя я могу создать DataFrame, но я должен сделать длину последовательной, что делает детали несовместимыми.
from urllib.request import urlopen
from bs4 import BeautifulSoup as soup
import pandas as pd
url = "https://www.amazon.in/s?k=smart+watch&page=1"
title = []
stars =[]
rating=[]
list_price = []
original_price=[]
url_list =[]
def getdata (url):
amazon_data = urlopen(url)
amazon_html = amazon_data.read()
a_soup = soup(amazon_html,'html.parser')
all_title = a_soup.findAll('span',{'class':'a-size-medium a-color-base a-text-normal'})
all_title = [t.text.split(">") for t in all_title]
for item in all_title:
title.append(item)
all_stars = a_soup.findAll('span',{'class':'a-icon-alt'})
all_stars = [r.text.split('>') for r in all_stars[:-4]]
for item in all_stars:
stars.append(item)
all_rating = a_soup.findAll('div',{'class':'a-row a-size-small'})
all_rating = [r.text.split('>') for r in all_rating]
for item in all_rating:
rating.append(item)
all_list_price = a_soup.findAll('span',{'class':'a-price-whole'})
all_list_price = [r.text.split('>') for r in all_list_price]
for item in all_list_price:
list_price.append(item)
all_original_price = a_soup.findAll('span',{'class':'a-price a-text-price'})
all_original_price = [o.find('span', {'class': 'a-offscreen'}).text.split('>') for o in all_original_price]
for item in all_original_price:
original_price.append(item)
return a_soup
def getnextpage(a_soup):
page= a_soup.find('a',attrs = {"class": 's-pagination-item s-pagination-next s-pagination-button s-pagination-separator'})
page = page['href']
url = 'http://www.amazon.in'+ str(page)
return url
while True:
geturl = getdata(url)
url = getnextpage(geturl)
url_list.append(url)
if not url:
break
print(url)
****OUTPUT****
http://www.amazon.in/smart-watch/s?k=smart+watch&page=2
http://www.amazon.in/smart-watch/s?k=smart+watch&page=3
http://www.amazon.in/smart-watch/s?k=smart+watch&page=4
http://www.amazon.in/smart-watch/s?k=smart+watch&page=5
http://www.amazon.in/smart-watch/s?k=smart+watch&page=6
http://www.amazon.in/smart-watch/s?k=smart+watch&page=7
http://www.amazon.in/smart-watch/s?k=smart+watch&page=8
http://www.amazon.in/smart-watch/s?k=smart+watch&page=9
http://www.amazon.in/smart-watch/s?k=smart+watch&page=10
http://www.amazon.in/smart-watch/s?k=smart+watch&page=11
http://www.amazon.in/smart-watch/s?k=smart+watch&page=12
http://www.amazon.in/smart-watch/s?k=smart+watch&page=13
http://www.amazon.in/smart-watch/s?k=smart+watch&page=14
http://www.amazon.in/smart-watch/s?k=smart+watch&page=15
http://www.amazon.in/smart-watch/s?k=smart+watch&page=16
http://www.amazon.in/smart-watch/s?k=smart+watch&page=17
http://www.amazon.in/smart-watch/s?k=smart+watch&page=18
http://www.amazon.in/smart-watch/s?k=smart+watch&page=19
http://www.amazon.in/smart-watch/s?k=smart+watch&page=20
**The length is not the same for all the attributes
лен (название) 306 Лен(звезды) 286 Лен(рейтинг) 286 лен (список_цена) 306 лен (исходная_цена) 306**
**Only when I make the length consistent, I am able to create the dataframe, but the problem is that the information is inconsistent **
title = title[:-20]
list_price = list_price[:-20]
original_price = original_price[:-20]
df = pd.DataFrame({'Title': title, 'Stars': stars, 'Rating':rating, 'List_Price': list_price, 'Original_Price':original_price})






Измените свою стратегию, чтобы поддерживать постоянную информацию. Не извлекайте все заголовки, все звезды, все рейтинги... со страницы. Я думаю, вы должны извлечь данные для каждого элемента:
data = []
def get_data(url)
...
for item in a_soup.find_all('div', {'class': 's-result-item'}):
if 's-widget' in item['class']:
continue
# extract information for each item
title = ...
stars = ...
rating = ...
price = ...
original = ...
data.append({'Title': title, 'Stars': stars, 'Rating': rating,
'List_Price': price, 'Original_Price': original})
df = pd.DataFrame(data)
Старайтесь избегать этих списков, используйте более структурированный подход и обрабатывайте данные более компактно:
import urllib.request
from bs4 import BeautifulSoup as soup
import pandas as pd
header = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)' }
...
data =[]
def getdata (url):
header = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)' }
req = urllib.request.Request(url, headers=header)
amazon_html = urllib.request.urlopen(req).read()
a_soup = soup(amazon_html,'html.parser')
for e in a_soup.select('div[data-component-type = "s-search-result"]'):
try:
title = e.find('h2').text
except:
title = None
try:
stars = e.find('span',{'class':'a-icon-alt'}).text.split(' ')[0]
except:
stars = None
try:
rating = e.find('span',{'class':'a-size-base s-underline-text'}).text
except:
rating = None
try:
list_price = e.find('span',{'class':'a-price-whole'}).text
except:
list_price = None
try:
original_price = e.find('span',{'class':'a-price a-text-price'}).find('span', {'class': 'a-offscreen'}).text
except:
original_price = None
data.append({
'title':title,
'stars':stars,
'rating':rating,
'list_price':list_price,
'original_price':original_price
})
return a_soup
...
Просто создайте свой DataFrame из своего списка диктовок:
pd.DataFrame(data)
| заглавие | звезды | рейтинг | список цен | оригинальная цена |
|---|---|---|---|---|
| Смарт-часы Fire-Bolt Thunder Bluetooth Calling Full Touch 1,32 дюйма с ЖК-дисплеем Amoled с SpO2, мониторингом сердечного ритма и сна, 30 спортивными режимами (золото-черный) | 4999 | ₹ 12 999 | ||
| Fire-Boltt Beast SpO2 1,69-дюймовый самый большой в отрасли размер дисплея Смарт-часы с полным сенсорным экраном с мониторингом кислорода в крови, монитором сердечного ритма, несколькими циферблатами и длительным временем автономной работы (черный) | 3,9 | 9990 | 2499 | ₹ 7999 |
| Умные часы Noise ColorFit Pulse с 1,4-дюймовым сенсорным HD-дисплеем, SpO2, пульсометром, мониторами сна и аккумулятором на 10 дней - Deep Wine | 4 | 32 619 | 2499 | ₹ 4999 |
| Смарт-часы Noise ColorFit Pulse Spo2 с 10-дневным временем автономной работы, более 60 циферблатов, 1,4-дюймовые смарт-часы с сенсорным HD-дисплеем, смарт-браслет с пульсометром 24*7, смарт-часы с мониторингом сна для мужчин и женщин и водонепроницаемость IP68 (угольно-черный) | 4 | 32 619 | 2499 | ₹ 4999 |
| Смарт-часы Noise ColorFit Ultra без рамки с 1,75-дюймовым HD-дисплеем TruView, 60 спортивными режимами, SpO2, пульсометром, монитором стресса, быстрого сна и сна, быстрым ответом на звонки и SMS, информацией о фондовом рынке (серый металлик) | 4.1 | 22 634 | 2999 | ₹ 5999 |
| Noise ColorFit Ultra Smart Watch с 1,75-дюймовым HD-дисплеем, корпусом из алюминиевого сплава, 60 спортивными режимами, Spo2, легким весом, информацией о фондовом рынке, ответом на звонки и SMS (Lush Olive) | 4.1 | 22 634 | 3499 | ₹ 6400 |
| Умные часы boAt Flash Edition с отслеживанием активности, несколькими спортивными режимами, сенсорным экраном 1,3 дюйма, монитором сна, жестами, управлением камерой и музыкой, защитой от пыли, пота и брызг IP68 (молниеносный черный) | 4.1 | 13 714 | 2499 | ₹ 6990 |
Проверьте свой предыдущий вопрос и мой отвечать, он основан на этой проблеме.
@ HedgeHog Ты облегчил мне задачу. Большое спасибо !
Здравствуйте, спасибо. Как это работает в цикле для всех страниц? Более того, я получаю сообщение об ошибке NameError: имя «urllib» не определено, что может быть с этим не так.