Как я могу получить постоянную длину для всех атрибутов, а также правильную информацию по сравнению со страницей сведений

Как я могу получить одинаковую длину для всех атрибутов, а также правильную информацию по сравнению со страницей сведений. Хотя я могу создать 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})
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
29
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Измените свою стратегию, чтобы поддерживать постоянную информацию. Не извлекайте все заголовки, все звезды, все рейтинги... со страницы. Я думаю, вы должны извлечь данные для каждого элемента:

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,999902499₹ 7999
Умные часы Noise ColorFit Pulse с 1,4-дюймовым сенсорным HD-дисплеем, SpO2, пульсометром, мониторами сна и аккумулятором на 10 дней - Deep Wine432 6192499₹ 4999
Смарт-часы Noise ColorFit Pulse Spo2 с 10-дневным временем автономной работы, более 60 циферблатов, 1,4-дюймовые смарт-часы с сенсорным HD-дисплеем, смарт-браслет с пульсометром 24*7, смарт-часы с мониторингом сна для мужчин и женщин и водонепроницаемость IP68 (угольно-черный)432 6192499₹ 4999
Смарт-часы Noise ColorFit Ultra без рамки с 1,75-дюймовым HD-дисплеем TruView, 60 спортивными режимами, SpO2, пульсометром, монитором стресса, быстрого сна и сна, быстрым ответом на звонки и SMS, информацией о фондовом рынке (серый металлик)4.122 6342999₹ 5999
Noise ColorFit Ultra Smart Watch с 1,75-дюймовым HD-дисплеем, корпусом из алюминиевого сплава, 60 спортивными режимами, Spo2, легким весом, информацией о фондовом рынке, ответом на звонки и SMS (Lush Olive)4.122 6343499₹ 6400
Умные часы boAt Flash Edition с отслеживанием активности, несколькими спортивными режимами, сенсорным экраном 1,3 дюйма, монитором сна, жестами, управлением камерой и музыкой, защитой от пыли, пота и брызг IP68 (молниеносный черный)4.113 7142499₹ 6990

Здравствуйте, спасибо. Как это работает в цикле для всех страниц? Более того, я получаю сообщение об ошибке NameError: имя «urllib» не определено, что может быть с этим не так.

Jhonny 17.03.2022 19:20

Проверьте свой предыдущий вопрос и мой отвечать, он основан на этой проблеме.

HedgeHog 17.03.2022 19:33

@ HedgeHog Ты облегчил мне задачу. Большое спасибо !

Jhonny 18.03.2022 06:26

Другие вопросы по теме