【问题标题】:Using Selenium+python to extract HTML code from a list of links使用 Selenium+python 从链接列表中提取 HTML 代码
【发布时间】:2021-11-03 02:05:39
【问题描述】:

我正在尝试从链接列表中获取多个页面源。我的想法是使用 webdriver 打开链接,将页面源保存在变量中,然后返回继续下一个链接。但由于某种原因,python 告诉我一个元素没有附加到页面文档。有什么解决方案吗?提前致谢!

browserFut = webdriver.Chrome(PATH)
browserFut.get(link)

page_sources = []
links = browserFut.find_element_by_xpath('//div[@class="dml-page-loader dml-page-loader--pb"]').find_elements_by_tag_name('a')
for link in links:
    link.click()
    page_sources += [browserFut.page_source]
    browserFut.back()
    time.sleep(1)

【问题讨论】:

  • 当第一个link.click() 被触发时会发生什么,它会将您重定向到任何地方吗?
  • 使用该代码,驱动程序完成一个循环,我的意思是,它打开第一个链接,保存它然后返回。之后它会发回我之前写的消息
  • 是的,我知道原因元素在第二个循环中变得陈旧。
  • 查看下面的答案,如果您遇到任何问题,请告诉我。

标签: python selenium selenium-webdriver beautifulsoup


【解决方案1】:

在第二个循环中,元素变得陈旧,因此您必须再次定义它们。

j = 0 
links = browserFut.find_element_by_xpath('//div[@class="dml-page-loader dml-page-loader--pb"]').find_elements_by_tag_name('a')
for link in range(len(links)):
    elements = browserFut.find_element_by_xpath('//div[@class="dml-page-loader dml-page-loader--pb"]').find_elements_by_tag_name('a')
    elements[j].click()
    page_sources += [browserFut.page_source]
    j = j +1 
    browserFut.back()
    time.sleep(5)

【讨论】:

  • 又是同样的问题。但我想我只是想通了。当我运行程序时,它会按照我所说的执行第一个循环。然后它卡住了,但我仍然可以与页面交互。当我手动单击按钮返回时,页面为空白,然后单击按钮前进,初始页面(我获取链接的页面)收费。我将尝试保存初始页面的链接并单击它而不是返回
  • 使用browserFut.execute_script("window.history.go(-1)") 而不是browserFut.back()。另外我认为首先保存链接是有意义的,因为您不会以任何方式丢失其中任何一个。
【解决方案2】:

我们需要在for 循环中再次分配链接。试试这样的。

length = len(browserFut.find_element_by_xpath('//div[@class="dml-page-loader dml-page-loader--pb"]').find_elements_by_tag_name('a'))
for i in range(length):
    links = browserFut.find_element_by_xpath('//div[@class="dml-page-loader dml-page-loader--pb"]').find_elements_by_tag_name('a')
    links[i].click()
    page_sources += [browserFut.page_source]
    browserFut.back()
    time.sleep(1)

如果链接在新标签页中打开,点击后:

length = len(browserFut.find_element_by_xpath('//div[@class="dml-page-loader dml-page-loader--pb"]').find_elements_by_tag_name('a'))
for i in range(length):
    links = browserFut.find_element_by_xpath('//div[@class="dml-page-loader dml-page-loader--pb"]').find_elements_by_tag_name('a')
    links[i].click()
    handles = driver.window_handles
    browserFut.switch_to.window((handles[1]))
    page_sources += [browserFut.page_source]
    browserFut.close()
    browserFut.switch_to.window(handles[0])
    time.sleep(1)

【讨论】:

  • 参考link
  • 好像也有同样的问题。循环内部肯定发生了一些我完全不理解的事情。它发回这条消息:没有这样的元素:无法找到元素:{“method”:“xpath”,“selector”:“//div[@class="dml-page-loader dml-page-loader--pb "]"}
  • @Juan José Campos - 试试这个 xpath 一次 links = browserFut.find_elements_by_xpath('//div[@class="dml-page-loader dml-page-loader--pb"]//a')
  • 完成,但没有明显改变
  • @Juan José Campos - 是否可以共享 URL。当您单击链接时,它是在新选项卡中打开还是在同一选项卡中打开。如果它在新标签页中打开,则完全不同。
【解决方案3】:

感谢为我提供建议的用户。终于,有些东西奏效了。唯一的区别是我正在使用的链接。似乎我使用了一些额外的链接,将我带到了同一页面。

page_sources = []
l = len(browserFut.find_element_by_xpath('//div[@class="dml-page-loader dml-page-loader--pb"]').find_elements_by_tag_name('a'))
for x in range(l):
    links = browserFut.find_element_by_xpath('//div[@class="dml-page-loader dml-page-loader--pb"]').find_elements_by_xpath('//div[@class="sp-o-market__title"]//a')
    links[x].click()
    page_sources += [browserFut.page_source]
    time.sleep(1)
    browserFut.back()
    time.sleep(1)
    

【讨论】:

  • 唯一的区别在于 xpath。正如我所说,我采取了一些额外的链接,其中大部分都是重复的,这就是我认为循环失败的原因。我真的不明白为什么但是在 xpath 的末尾添加“//a”并删除那些额外的链接会使代码工作。但无论如何,谢谢你们,用 [x] 选择项目而不是迭代链接的想法很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2019-11-12
  • 1970-01-01
相关资源
最近更新 更多