使用Selenium + Python遍历链接并从结果页面中抓取数据

时间:2019-02-08 10:09:04

标签: python selenium

我是Selenium的新手,需要抓捕一个网站,该网站包含的链接结构完全相同:

<a class="unique" href="...">
    <i class="something"></i>
    "Text - "
    <span class="something">Text</span>
</a>
<a class="unique" href="...">
    <i class="something"></i>
    "Text - "
    <span class="something">Text</span>
</a>
...
...

我需要在循环内单击此链接列表,然后从结果页面抓取数据。 到目前为止,我所做的是:

lists = browser.find_elements_by_xpath("//a[@class='unique']")
for lis in lists:
    print(lis.text)
    lis.click()
    time.sleep(4)
    # Scrape data from this page (works fine).
    browser.back()
    time.sleep(4)

它在第一个循环中工作正常,但是在第二个循环到达时

print(lis.text)

它抛出一个错误:

  

StaleElementReferenceException:消息:stale元素引用:元素未附加到页面文档

我尝试过print (lists),它给出了所有链接元素的列表,因此效果很好。当浏览器返回上一页时,会发生此问题。我尝试延长时间并使用browser.get(...)而不是browser.back(),但错误仍然存​​在。我不明白为什么它不会打印lis.text,因为列表仍然包含所有元素的列表。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您试图单击文本而不是启动链接。

然后点击每个链接,抓取数据并向后导航似乎也不有效,相反,您可以将所有链接存储在某个列表中,然后可以使用driver.get('some link')方法导航到每个链接,然后可以抓取数据。为了避免出现某些异常,请尝试以下修改后的代码:

# Locate the anchor nodes first and load all the elements into some list
lists = browser.find_elements_by_xpath("//a[@class='unique']")
# Empty list for storing links
links = []
for lis in lists:
    print(lis.get_attribute('href'))
    # Fetch and store the links
    links.append(lis.get_attribute('href'))

# Loop through all the links and launch one by one
for link in links:
    browser.get(link)
    # Scrap here
    sleep(3)

或者如果您想使用相同的逻辑,则可以使用Fluent Wait来避免某些异常,例如StaleElementReferenceException,如下所示:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import *

wait = WebDriverWait(browser, 10, poll_frequency=1, ignored_exceptions=[StaleElementReferenceException])
element = wait.until(EC.element_to_be_clickable((By.XPATH, "xPath that you want to click")))

希望对您有帮助...