Как я могу избежать неоднородных списков при очистке с помощью selenium и Python?
Я пытаюсь наскрести данные в CSV-файл с веб-сайта, который содержит контактную информацию для людей в моей отрасли. Мой код работает хорошо, пока я не попадаю на страницу, где одна из записей не содержит определенного элемента.
Так например:
Я пытаюсь собрать деньги
Имя, телефон, URL профиля
Если для конкретной записи не указан номер телефона, то для этой записи нет даже тега с пустым текстом, и мой код ошибается с
"IndexError: list index out of range"
Код, который я вставил ниже, работает для меня на нескольких веб-сайтах (с явно измененными XPath/URL-адресами), пока все поля существуют на странице с соответствующими тегами. Но если один из тегов //div[contains(@class, "agent-phone")] отсутствует в одном из списков, он выдает ошибку.
from selenium import webdriver driver = webdriver.Firefox() MAX_PAGE_NUM = 23 MAX_PAGE_DIG = 2 with open('results.csv', 'w') as f: f.write("Name, Number, URL \n") #Run Through Pages, for i in range(1, MAX_PAGE_NUM + 1): page_num = (MAX_PAGE_DIG - len(str(i))) * "0" + str(i) website = "https://www.website.com/area/pg-" + page_num driver.get(website) Name = driver.find_elements_by_xpath('//div[contains(@class, "agent-name")]/a') Number = driver.find_elements_by_xpath('//div[contains(@class, "agent-phone")]') URL = driver.find_elements_by_xpath('//div[contains(@class, "agent-name")]/a') num_page_items = len(Name) for i in range(num_page_items): print(Name[i].text.replace(",", ".") + "," + Number[i].text + "," + URL[i].get_attribute('href') + "\n") with open('results.csv', 'a') as f: for i in range(num_page_items): f.write(Name[i].text.replace(",", ".") + "," + Number[i].text + "," + URL[i].get_attribute('href') + "\n") driver.close()
Что я уже пробовал:
Я попытался продолжить, когда столкнулся с ошибкой индекса. Проблема в том, что ошибка не возникает до конца страницы, что означает, что список без номера телефона просто берет номер телефона из следующего списка, делая столбец телефонных номеров не по порядку.
num_page_items = len(Name) with open('results.csv', 'a') as f: for i in range(num_page_items): try: f.write(Name[i].text.replace(",", ".") + "," + Number[i].text + "," + URL[i].get_attribute('href') + "\n") print(Name[i].text.replace(",", ".") + "," + Number[i].text + "," + URL[i].get_attribute('href') + "\n") except IndexError: f.write("Nothing, Nothing, Nothing \n") print("No element found") continue
Я пытаюсь понять, как проверить, существуют ли все элементы в каждой записи. Если одна или несколько ячеек отсутствуют, либо пропустите всю эту запись, либо просто поставьте "пусто" для этой ячейки в CSV. Я пробовал разные вещи с NoSuchElementException, но я просто не могу заставить что-то стрелять.
Я довольно Новичок во всем этом. Заранее спасибо за любую помощь.
F-ES Sitecore
То, что ты делаешь, неэтично. Если вам нужны данные, которые кто-то другой потратил время, усилия и затраты, то попросите их об этом, если они не возражают отдать их, у них будет API или дамп данных, который вы можете использовать.
FakeHelicopterPilot
Ф-ЭС. Я думаю, что это вопрос мнения. Это все равно что сфотографировать телефонную книгу. Если информация доступна, нет ничего плохого в ее использовании. Информация, которую я соскребаю, существует специально для деловых целей. Я просто делаю его более удобоваримым для того, как мы должны его использовать. Не каждый веб-сайт достаточно развит, чтобы иметь API.
MadMyche
Я думаю, что это вопрос веб-сайта. Авторское право и их условия обслуживания.
FakeHelicopterPilot
Если я планирую продать данные или предложить их публично, это вопрос авторского права. Что касается условий обслуживания, то я не очень беспокоюсь об этом, и именно здесь возникают мнения, касающиеся этики.
Если общедоступные данные легко доступны в интернете, которые могут быть собраны, чтобы облегчить мою жизнь и сэкономить мне незаменимый товар, мое время, я собираюсь воспользоваться этой возможностью.
Если бы я был человеком дождя, я мог бы просто щелкнуть вручную и запомнить каждую запись. Питон - мой личный Человек дождя.