Pandas для Excel и цикла селена - PullRequest
       134

Pandas для Excel и цикла селена

0 голосов
/ 07 августа 2020

Я пытаюсь распечатать значения из excel, а значения указаны в числах. Моя цель - прочитать эти значения и выполнить поиск в Google один за другим. Остановится на x секунд, когда значение равно 'nan', затем пропустите это 'nan' и продолжайте переходить к следующему.

Возникшие проблемы:

  1. Он распечатывается в scientifi c формат записи
  2. Хочу перестать делать что-то, когда его 'nan' в excel
  3. Скопируйте UPC [i] в ​​поиск Google, но я хотел скопировать только один раз, потому что я хотите создать его, откройте новую вкладку, затем скопируйте второй UPC [i]

Мое решение:

  1. У меня есть 'lambda x:'% 0.2f '% x' внутри set_option, чтобы он распечатал xxxxxx.00 с 2 десятичными знаками. Даже я хочу, чтобы это было в int, но это уже лучше, чем scientifi c формат записи
  2. Используется 'if', чтобы увидеть, равно ли значение в upc [i] 'nan' <- nan - это то, что я получил из печати. Но он по-прежнему распечатывает диапазон из 20 значений с помощью 'nan'. </li>
  3. Я ничего не могу сейчас придумать

Код:

import pandas as pd
import numpy as np
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
import msvcrt
import datetime
import time

driver = webdriver.Chrome()
#Settings
pd.set_option('display.width',10, 'display.max_rows', 10, 'display.max_colwidth',100, 'display.width',10, 'display.float_format', lambda x: '%0.2f' % x)

df = pd.read_excel(r"BARCODE.xlsx", skiprows = 2, sheet_name = 'products id')

#Unnamed: 1 is also an empty column, i just didn't input UPC as title in excel.
upc = df['Unnamed: 1']

#I can't print out as interger...It will always have a xxxxx.0
print((upc[0:20]))

count = len(upc)
i = 0
for i in range(count ):
    if upc[i] == 'nan':
        'skip for x seconds and continue, i am not sure how to do yet'
    else:
        print(int(upc[i]))
        driver.get('https://www.google.com')
        driver.find_element_by_name('q').send_keys(int(upc[i]))
        i = i + 1

Распечатать :

3337872411991.0
3433422408159.0
3337875598071.0
3337872412516.0
3337875518451.0
3337875613491.0
3337872413025.0
3337875398961.0
3337872410208.0
nan          <- i want program to stop here so i can do something else.
3337872411991.0
3433422408159.0
3337875598071.0
3337872412516.0
3337875518451.0
3337875613491.0
3337872413025.0
3337875398961.0
3337872410208.0
nan
Name: Unnamed: 1, Length: 20, dtype: float64
3337872411991
3433422408159
3337875598071
3337872412516
3337875518451
etc....

Погуглил некоторый формат числа, например, установил формат печати, но я запутался между .format и lambda.

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Он распечатывается в научном c формате нотации

Кажется, у вас есть такие числа, как UP C и EAN. Вероятно, вы можете решить эту проблему, пометив числа как текст. Если вам нужно всегда иметь длину 13, вы можете исправить это, добавив нули в начале.

Хотите прекратить что-то делать, когда его nan в excel

Самое простое решение можно использовать ввод и принять любой символ для продолжения выполнения вашего кода. Но если вы хотите иметь несколько секунд, time.sleep() тоже хорошо

Скопируйте UPC [i] в ​​поиск Google, но я хотел скопировать только один раз, потому что я хочу создать его, откройте новый затем скопируйте второй UPC [i]

Некоторые моменты, которые вы можете пересмотреть:

  • Итерация в python может быть выполнена с помощью enumerate(), если вам нужно значения индекса. Если вам не нужен индекс, вы можете просто отказаться от него. for value in data_frame['UPC']:
  • С помощью селена вы можете напрямую очищать результаты вместо использования новых вкладок.

Ниже вы можете проверить рабочий пример (по крайней мере, на моей машине с python3, w10 и chrome exe driver).

import pandas as pd
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys

# Settings
pd.set_option('display.width', 10, 'display.max_rows', 10, 'display.max_colwidth', 100, 'display.width', 10,
              'display.float_format', lambda x: '%0.2f' % x)

data_frame = pd.read_excel('test.xlsx', sheet_name='products id', skip_blank_lines=False)

# I have chrome driver in exe, so this is how I need to inject it to get driver out
driver = webdriver.Chrome('chromedriver.exe')
google = 'https://www.google.com'

for index, value in enumerate(data_frame['UPC']):  # named the column in excel file
    if pd.isna(value):
        print('{}: zzz'.format(index))
        sleep(2)  # will sleep for 2 seconds, use input() if you want to wait indefinitely instead
    else:
        print('{}: {} {}'.format(index, value, type(value)))
        # since given values are float, you can convert it to int
        value = int(value)
        driver.get(google)
        google_search = driver.find_element_by_name('q')
        google_search.send_keys(value)
        google_search.send_keys('\uE007')  # this is "ENTER" for committing your search in google or Keys.ENTER

        sleep(0.5)
        # you may want to wait a bit before page loads fully, then scrape info you want
        # also consider using try-except blocks if something unexpected happens

        # if you want to open new tab (windows + chrome driver)
        # open a link in a new window - workaround
        helping_link = driver.find_element_by_link_text('Help')
        actions = ActionChains(driver)
        actions.key_down(Keys.CONTROL).click(helping_link).key_up(Keys.CONTROL).perform()
        driver.switch_to.window(driver.window_handles[-1])

# close your instance of chrome driver or leave it if you need your tabs
# driver.close()
1 голос
/ 07 августа 2020
  1. проверьте этот пост
if upc[i].isnull():
    time.sleep(3)

проверьте этот пост , который сводится к:

driver.execute_script ("window.open ('https://www.google.com');") driver.switch_to. окно (driver.window_handles [-1])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...