Селен + Python.Как найти несколько элементов в определенном элементе? - PullRequest
0 голосов
/ 02 мая 2019

Я использую Python + Selenium для очистки данных с сайта, который перечисляет информацию о компаниях.

Для каждой компании мне нужно 2 точки данных - электронная почта и URL.

Проблема в том, что- для некоторых компаний электронная почта не указана, и если я получу отдельно список URL-адресов и электронных писем, я не смогу подобрать пары (список электронных писем будет короче, чем список URL-адресов, и я не буду знать, какие из электронных писемотсутствует).

Так что я подумал, что, может быть, есть способ получить корневые элементы каждого из блоков компаний (скажем, это div с классом «provider»), а затем искать в каждом из них электронную почтуи URL.

Возможно ли это, и если да - как?

Ответы [ 3 ]

1 голос
/ 02 мая 2019

Вот полная логика.

url = "https://clutch.co/web-designers?page=0"
driver.get(url)
pros = driver.find_elements_by_css_selector("li.provider-row")
providers =[]
for provider in pros:

    pUrl = provider.find_element_by_css_selector(".website-link.website-link-a a").get_attribute("realurl")
    if (len(provider.find_elements_by_css_selector(".contact-dropdown .item a"))>0):
        pEmail = provider.find_element_by_css_selector(".contact-dropdown .item a").get_attribute('textContent')
    else:
        pEmail=''
    providers.append("{" + pUrl + "," +  pEmail + "}")
print(providers)
1 голос
/ 02 мая 2019

Есть два способа сделать это.

Первый : просто используйте селектор, чтобы найти элемент в дочерних элементах этого элемента 'div'.Вы можете использовать функции find_elements, чтобы проверить, сколько родительских div'ов есть вначале, а затем выполнить цикл столько раз.Этот метод не рекомендуется.

Second : Вы можете вызвать семейство функций find_element для объекта webelement.

Предположим, что я работаю над this сайт.

### First method:
FirstTitleInDiv = driver.find_element_by_css_selector(".row.test-site:nth-of-type(1) h2") # get first title
SecondTitleInDiv = driver.find_element_by_css_selector(".row.test-site:nth-of-type(2) h2") # get second title
# ... and so on.

### Second method:
Div_Els = driver.find_elements_by_css_selector(".row.test-site") # get list of all divs
# You can now loop through all divs in order to do following:
FirstTitleInDiv = Div_Els[0].find_element_by_css_selector("h2") # get first title
SecondTitleInDiv = Div_Els[1].find_element_by_css_selector("h2") # get second title
# ... and so on.
0 голосов
/ 02 мая 2019

Хорошо, я нашел решение.

Сначала вы собираете все блоки с полями, которые вам нужно получить. Пример:

providers = browser.find_elements_by_class_name('provider-row')

И затем вы используете метод find_elements_by_xpath () с локатором, начинающимся с ".//", что означает поиск внутри определенного элемента. Пример:

providers[0].find_elements_by_xpath(".//li[@class='website-link website-link-a']/a[@class='sl-ext']")

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