FakeHelicopterPilot Ответов: 1

Как я могу избежать неоднородных списков при очистке с помощью 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

Если я планирую продать данные или предложить их публично, это вопрос авторского права. Что касается условий обслуживания, то я не очень беспокоюсь об этом, и именно здесь возникают мнения, касающиеся этики.

Если общедоступные данные легко доступны в интернете, которые могут быть собраны, чтобы облегчить мою жизнь и сэкономить мне незаменимый товар, мое время, я собираюсь воспользоваться этой возможностью.

Если бы я был человеком дождя, я мог бы просто щелкнуть вручную и запомнить каждую запись. Питон - мой личный Человек дождя.

1 Ответов

Рейтинг:
2

Gerry Schmitz

Используйте дополнительную кому или вставьте "держатель места" для отсутствующих полей. Что ещё.