按属性获取元素并使用驱动程序在webscraping中单击子元素 - Python

时间:2018-06-06 20:05:45

标签: python selenium selenium-webdriver web-scraping beautifulsoup

来自Indeed.com的网页结果

- 搜索' Junior Python'在加利福尼亚州洛杉矶' (完成)

- 有时弹出窗口打开。如果出现弹出窗口,请关闭窗口。(完成)

-Top 3结果是赞助的,所以跳过这些并转到实际结果

- 点击结果摘要部分,打开侧面板并附上完整摘要

- 详细说明

- 点击结果摘要后,网址会发生变化。而不是打开新窗口,我想刮掉侧面板的完整摘要

- 每个真实结果都在('div':{'data-tn-component':'organicJob'})下。我可以使用BeautifulSoup获得jobtitle,公司和简短摘要。但是,我想在侧面板上获得完整的摘要。

问题

1)当我尝试点击链接(使用Selenium)(作业标题或简短的摘要,打开侧面板)时,代码最终点击第一个链接,这是赞助& #39 ;.无法在id =' jobOrganic'下找到并点击真实结果

2)点击(手动)实际结果后,我可以看到完整的摘要侧面板位于<td id='auxCol'>下,在此下面。完整摘要包含在<p>标记中。当我尝试使用findAll('div':{'id':'vjs-desc'})获取硒刮完整摘要时,我得到的只是空白结果[]。

3)打开侧面板时,网址也会发生变化。我尝试使用Selenium让驱动程序获取新网址,然后将网址添加到网上以获得结果,但我得到的是第一个赞助结果,这不是我想要的。我不确定为什么BeautifulSoup不断获得赞助的结果,即使我在'id='jobOrganic'实际结果下运行代码也是如此。

这是我的代码。我已经做了近两天的工作,经历了stackoverflow,文档和谷歌但无法找到答案。我希望有人可以指出我做错了什么以及为什么我无法得到完整的摘要。

非常感谢和抱歉。

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

这就是我被困的地方。结果摘要位于{&#39; data-tn-component&#39;:&#39; organicJob&#39;},span class =&#39; summary&#39;。点击此按钮后,侧面板就会打开。

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()

这会打开侧面板,但它会点击整个页面中的第一个赞助商链接(赞助商链接),而不是实际结果。这基本上是出于&#39; organicJob&#39;结果集由于某种原因。

url = driver.current_url
driver.get(url)

我点击链接(赞助)后试图设置新网址,以测试我是否可以获得侧面板完整摘要(虽然赞助,作为测试目的)。

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

这实际上打印出侧面板的完整摘要,但它在整个循环中反复打印相同的第一个结果,而不是移动到下一个。

1 个答案:

答案 0 :(得分:1)

问题是你使用漂亮的汤取出div但是,点击使用不知道你收集的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,并对其进行迭代以查找包含data-tn-component属性organicJob的div。一旦找到一个,它将搜索具有类名summary的元素并单击该元素。