Получение элемента по атрибуту и ​​использование драйвера для нажатия на дочерний элемент в webscraping - Python - PullRequest
0 голосов
/ 06 июня 2018

Результаты веб-скрининга с сайта действительно.com

-Поиск 'Junior Python' в 'Лос-Анджелес, Калифорния' (Готово)

-Не открывается всплывающее окно.Закройте всплывающее окно, если появится всплывающее окно. (Готово)

-Top 3 результаты спонсируются, поэтому пропустите их и переходите к реальным результатам

-Нажмите на раздел сводки результатов, который открывает боковую панель с полной сводкой

-Очистить полную сводку

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

- каждый реальный результат находится под ('div':{'data-tn-component':'organicJob'}).Я могу получить название, компанию и краткое резюме, используя BeautifulSoup.Тем не менее, я хотел бы получить полную сводку на боковой панели.

Проблема

1) Когда я пытаюсь нажать на ссылку (используя Selenium) (название работы или краткую сводку, котораяоткрывает боковую панель), код заканчивает тем, что нажимает на 1-ю ссылку, которая является «спонсируемой».Невозможно найти и щелкнуть по реальному результату в id = 'jobOrganic'

2) После нажатия на реальный результат (вручную), я вижу, что полная сводная боковая панель находится под <td id='auxCol'>, и внутри этого, под .Полное резюме содержится в тегах <p>.Когда я пытаюсь получить полную сводку по селену, используя findAll('div':{'id':'vjs-desc'}), все, что я получаю, это пустой результат [].

3) URL-адрес также изменяется при открытии боковой панели.Я пытался использовать Selenium, чтобы драйвер получил новый URL, а затем набрал URL, чтобы получить результаты, но все, что я получаю, это первый спонсируемый результат, а это не то, чего я хочу.Я не уверен, почему BeautifulSoup продолжает получать результаты для спонсоров, даже когда я запускаю код под 'id='jobOrganic' реальными результатами.

Вот мой код.Я работал над этим почти два последних дня, изучил stackoverflow, документацию и Google, но не смог найти ответ.Я надеюсь, что кто-то может указать, что я делаю неправильно, и почему я не могу получить полное резюме.

Спасибо и извините, что так долго.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup as bs    

url = 'https://www.indeed.com/'
driver = webdriver.Chrome()
driver.get(url)

whatinput = driver.find_element_by_id('text-input-what')
whatinput.send_keys('Junior Python')

whereinput = driver.find_element_by_id('text-input-where')
whereinput.click()
whereinput.clear()
whereinput.send_keys('Los Angeles, CA')

findbutton = driver.find_element_by_xpath('//*[@id="whatWhere"]/form/div[3]/button')
findbutton.click()

try:
    popup = driver.find_element_by_id('prime-popover-close-button')
    popup.click()
except:
    pass

Вот где я застрял.Сводка результатов находится в разделе {'data-tn-component': 'organicJob'}, span class = 'summary'.Как только я нажимаю на это, открывается боковая панель.

soup = bs(driver.page_source,'html.parser')
contents = soup.findAll('div',{"data-tn-component":"organicJob"})
for each in contents:
    summary = driver.find_element_by_class_name('summary')
    summary.click()

Открывается боковая панель, но при этом щелкает первая рекламная ссылка на всей странице (спонсорская ссылка), а не реальный результат.По какой-то причине это в основном выходит за пределы набора «OrganicJob».

url = driver.current_url
driver.get(url)

Я попытался установить новый URL после нажатия на ссылку (спонсорская), чтобы проверить, могу ли я получить полную сводку боковой панели (хотя и спонсируемой, в качестве цели тестирования).

soup=bs(driver.page_source,'html.parser')
fullsum = soup.findAll('div',{"id":"vjs-desc"})
print(fullsum)

Это фактически печатает полную сводку боковой панели, но она продолжает печатать один и тот же 1-й результат снова и снова по всему циклу, вместо того, чтобы переходить к следующему.

1 Ответ

0 голосов
/ 06 июня 2018

Проблема в том, что вы выбираете div s, используя красивый суп, но нажимаете, используя селен, который не знает о ваших собранных div.
Когда вы используете find_element_by_class_name() метод объекта driver.Он ищет всю страницу вместо вашего предполагаемого объекта div each (в цикле for).Таким образом, он заканчивает тем, что выбирал один и тот же первый результат со всей страницы в каждой итерации.
Во-первых, можно быстро обойтись, используя только селен (хотя это будет медленнее)

elements = driver.find_elements_by_tag_name('div')
for element in elements:
    if "organicJob" in element.get_attribute("data-tn-component"):
        summary = element.find_element_by_class_name('summary')
        summary.click()

Приведенный выше кодбудет искать все элементы div и перебирать их, чтобы найти элементы div с атрибутом data-tn-component, содержащим organicJob.Когда он найдет его, он будет искать элемент с именем класса summary и щелкнет по этому элементу.

...