Очистка мобильных данных flipkart с использованием Selenium и Python

#python #selenium #web-scraping

Вопрос:

Мне нужно уточнить некоторые детали после поиска модели телефона на Флипкарте. Я решил просмотреть таблицу и получить данные. Вот код, который я использую

 # creating a URL variable to store website URL
url_fkrt=('https://flipkart.com')

# Establishing connection with the website
driver.get(url_fkrt)
time.sleep(2)


# Closing the login dialogue box appearing at first visit
try:
    driver.find_element_by_xpath("//button[@class='_2KpZ6l _2doB4z']").click()
except NoSuchElementException:
    pass

# Creating object of the search bar by finding it through Class name
search_bar_fk=driver.find_element_by_class_name('_3704LK')

# Clearing the bar if there is any text in it
search_bar_fk.clear()

# Sending required product to the search bar
search_bar_fk.send_keys('galaxy note 20')

# Creating object of the search button and sending click commamnd
search_btn_fk=driver.find_element_by_class_name('_34RNph')
search_btn_fk.click()
time.sleep(3) # pausing the code for 3 seconds, allowing page to load

# Creating empty lists to store data

phone_name=[]
phone_colour=[]
phone_ram=[]
phone_storage=[]
camera_p=[]
camera_s=[]
display_size=[]
display_resolution=[]
phone_processor=[]
processor_cores=[]
battery_capacity=[]
urls=[]

# Collecting URLs for each product on the page

for links in driver.find_elements_by_xpath("//a[@class='_1fQZEK']"):
    urls.append(links.get_attribute('href'))

# Iterating through the URL list and accessing each link to extract data    
for url in urls:
    driver.get(url)
    time.sleep(2)

    # Finding the Read More button and clicking it
    driver.find_element_by_xpath("//button[@class='_2KpZ6l _1FH0tX']").click()
    time.sleep(1)
    
    # Storing all the table rows
    model=driver.find_elements_by_xpath("//tr[@class='_1s_Smc row']")

    # Iterating through the Table rows to get required data
    for name in model:
        text1=name.find_element_by_xpath("td[1]").text # Storing text for first Table Data for each row to check 'if' condition
    
        # Extracting Model name
        if text1=='Model Name':
            phone_name.append(name.find_element_by_xpath("td[2]").text)

        # Extracting Phone Color
        if text1=='Color':
            phone_colour.append(name.find_element_by_xpath("td[2]").text)

        # Extracting Display Size
        if text1=='Display Size':
            display_size.append(name.find_element_by_xpath("td[2]").text)

        # Extracting Display Resolution
        if text1=='Resolution':
             display_resolution.append(name.find_element_by_xpath("td[2]").text)

        # Extracting Processor        
        if text1=='Processor Type':
            phone_processor.append(name.find_element_by_xpath("td[2]").text)

        # Extracting Cores in Processor
        if text1=='Processor Core':
            processor_cores.append(name.find_element_by_xpath("td[2]").text)

        # Extracting Internal Storage(ROM)
        if text1=='Internal Storage':
            phone_storage.append(name.find_element_by_xpath("td[2]").text)

        # Extracting RAM Memory
        if text1=='RAM':
            phone_ram.append(name.find_element_by_xpath("td[2]").text)

        # Extracting Primary Camera Details
        if text1=='Primary Camera':
            camera_p.append(name.find_element_by_xpath("td[2]").text)

        # Extracting Secondary Camera Details

        if text1=='Secondary Camera':
            camera_s.append(name.find_element_by_xpath("td[2]").text)

        # Extracting Battery Capacity
        if text1=='Battery Capacity':
            battery_capacity.append(name.find_element_by_xpath("td[2]").text)
 

Чего я не могу сделать, так это то, что если конкретные детали (предположим, «процессор») не найдены для модели, то она должна добавить » — » в список.

Есть какие-нибудь предложения?? Или есть ли какой-либо другой подход лучше, чем этот.

Комментарии:

1. первое использование find_element_by_xpath , следующая проверка, если вы что — то получили — возможно, потребуется запустить в try/except-и затем добавить значение или - в список.

2. Я бы сохранил всю информацию для одного телефона в виде словаря и добавил ее в один список — append( {"phone_name": ..., "phone_colour": ... , ...} )

Ответ №1:

Если я вас правильно понимаю, вы можете сделать что-то подобное для всех деталей:

desc_td = name.find_element_by_xpath("td[2]")

desc_dtl = desc_td.text if desc_td is not None else "-"

phone_processor.append(desc_dtl)

Это делается для добавления значения описания продукта, если оно существует, а если нет, то вместо него будет добавлено» -«.