Итак, я собираюсь очистить 2 таблицы (в разных форматах) с веб-сайта - https://info.fsc.org/details.php?id=a0240000005sQjGAAU&type=certificate после использования панели поиска для повторения этого по списку кодов лицензий. Я еще не включил цикл полностью, но я добавил его сверху для полноты.
Моя проблема заключается в том, что поскольку две таблицы, которые я хочу, - Данные о продукте и Данные сертификата - имеют два разных формата, поэтому мне приходится обрабатывать их отдельно. Поскольку данные о продукте представлены в обычном формате «tr» на веб-странице, этот бит прост, и мне удалось извлечь из него CSV-файл. Сложнее всего извлечь данные сертификата, так как они находятся в форме "div".
Мне удалось распечатать данные сертификата в виде текста, используя функцию класса, однако мне нужно сохранить их в виде таблицы, сохраненной в файле CSV. Как вы можете видеть, я пробовал несколько неудачных способов конвертировать его в CSV, но если у вас есть какие-либо предложения, это будет высоко ценится, спасибо! Также были бы полезны любые другие общие советы по улучшению моего кода, так как я новичок в изучении веб-страниц.
#namelist = open('example.csv', newline='', delimiter = 'example')
#for name in namelist:
#include all of the below
driver = webdriver.Chrome(executable_path="/Users/jamesozden/Downloads/chromedriver")
url = "https://info.fsc.org/certificate.php"
driver.get(url)
search_bar = driver.find_element_by_xpath('//*[@id="code"]')
search_bar.send_keys("FSC-C001777")
search_bar.send_keys(Keys.RETURN)
new_url = driver.current_url
r = requests.get(new_url)
soup = BeautifulSoup(r.content,'lxml')
table = soup.find_all('table')[0]
df, = pd.read_html(str(table))
certificate = soup.find(class_= 'certificatecl').text
##certificate1 = pd.read_html(str(certificate))
driver.quit()
df.to_csv("Product_Data.csv", index=False)
##certificate1.to_csv("Certificate_Data.csv", index=False)
#print(df[0].to_json(orient='records'))
print certificate
Выход:
Status
Valid
First Issue Date
2009-04-01
Last Issue Date
2018-02-16
Expiry Date
2019-04-01
Standard
FSC-STD-40-004 V3-0
Что я хочу, но более сотни / тысячи кодов лицензий (я только что вручную создал этот пример в Excel):
Желаемый выход
EDIT
Итак, пока это работает для данных сертификата, я также хочу собрать данные продукта и вывести их в другой файл .csv. Однако в настоящее время печатается только 5 копий данных продукта для окончательного лицензионного кода, а это не то, что мне нужно.
Новый код:
df = pd.read_csv("MS_License_Codes.csv")
codes = df["License Code"]
def get_data_by_code(code):
data = [
('code', code),
('submit', 'Search'),
]
response = requests.post('https://info.fsc.org/certificate.php', data=data)
soup = BeautifulSoup(response.content, 'lxml')
status = soup.find_all("label", string="Status")[0].find_next_sibling('div').text
first_issue_date = soup.find_all("label", string="First Issue Date")[0].find_next_sibling('div').text
last_issue_date = soup.find_all("label", string="Last Issue Date")[0].find_next_sibling('div').text
expiry_date = soup.find_all("label", string="Expiry Date")[0].find_next_sibling('div').text
standard = soup.find_all("label", string="Standard")[0].find_next_sibling('div').text
return [code, status, first_issue_date, last_issue_date, expiry_date, standard]
# Just insert here output filename and codes to parse...
OUTPUT_FILE_NAME = 'Certificate_Data.csv'
#codes = ['C001777', 'C001777', 'C001777', 'C001777']
df3=pd.DataFrame()
with open(OUTPUT_FILE_NAME, 'w') as f:
writer = csv.writer(f)
for code in codes:
print('Getting code# {}'.format(code))
writer.writerow((get_data_by_code(code)))
table = soup.find_all('table')[0]
df1, = pd.read_html(str(table))
df3 = df3.append(df1)
df3.to_csv('Product_Data.csv', index = False, encoding='utf-8')