【问题标题】:Getting an element by attribute and using driver to click on a child element in webscraping - Python通过属性获取元素并使用驱动程序单击 webscraping 中的子元素 - Python
【发布时间】:2018-11-16 15:05:27
【问题描述】:

来自 Indeed.com 的网页抓取结果

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

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

-前 3 个结果是赞助的,所以跳过这些并转到真正的结果

-点击结果摘要部分,打开带有完整摘要的侧面板

-抓取完整的摘要

-当点击结果摘要时,url 改变。我不想打开新窗口,而是想刮掉侧面板的完整摘要

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

问题

1) 当我尝试点击链接(使用 Selenium)(职位或简短摘要,打开侧面板)时,代码只会点击第一个链接,即“赞助”。在 id='jobOrganic' 下无法定位和点击真实结果

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

3) 打开侧面板时,url 也会发生变化。我尝试使用 Selenium 让驱动程序获取新的 url,然后对 url 进行调整以获得结果,但我得到的只是第一个赞助结果,这不是我想要的。我不确定为什么 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

这就是我卡住的地方。结果摘要在 {'data-tn-component':'organicJob'} 下,跨度 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)

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

【问题讨论】:

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


    【解决方案1】:

    问题是您正在使用漂亮的汤获取divs,但是使用不知道您收集的 div 的 selenium 单击。
    当您使用 find_element_by_class_name() 对象的 find_element_by_class_name() 方法时。它搜索整个页面而不是您想要的 div 对象each(在 for 循环中)。因此,它最终会在每次迭代中从整个页面中获取相同的第一个结果。
    一,仅使用 selenium 可以快速解决问题(虽然这会更慢)

    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 的元素并单击该元素。

    【讨论】:

    • 不错的收获fetching divs using beautiful soup but, clicking using selenium +1 !!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多