【问题标题】:Get a page with Selenium but wait for unknown element value to not be empty使用 Selenium 获取页面但等待未知元素值不为空
【发布时间】:2021-03-06 15:07:27
【问题描述】:

上下文

这是Get a page with Selenium but wait for element value to not be empty的转贴,据我所知已关闭,没有任何有效性。

闭包推理中的链接答案都依赖于知道预期的文本值是什么。在每个答案中,它明确显示硬编码到 WebDriverWait 调用中的预期文本。此外,链接的答案都没有触及我问题的最后一部分:

[期望条件]在页面获取之前还是之后来

“重复”问题


原始问题

我正在使用 Selenium 抓取一个网页,但我需要等待某个值才能加载。我不知道值是什么,只知道它会出现在什么元素中。

似乎使用预期的条件 text_to_be_present_in_element_valuetext_to_be_present_in_element 是最有可能的前进方式,但我很难找到任何关于如何使用这些的实际文档,我不知道它们是否出现在之前或页面获取后:

webdriver.get(url)

改写

如何使用 Selenium 获取页面,但在继续之前等待未知文本值填充元素的文本或值?

【问题讨论】:

  • 你能在元素存在之前和之后添加 HTML 吗?你看过stackoverflow.com/questions/28240342/…吗?
  • @MaximilianPeters 我需要的特定元素似乎总是存在于抓取的文档中,只是其中没有文本值。当我在浏览器中加载页面时,在填充之前该值是空白的一两秒钟。我很想发布原始 HTML,但我现在正在处理一个阻止我登录该站点的身份验证问题。一旦客户端修复了他们的身份验证,我将使用原始 HTML 进行更新。您的链接问题看起来很有希望。解封后我会试一试。
  • 似乎你只需要一个轮询循环......检查元素是否为空。如果不是,那么继续。您不需要 webdriverwait 或预期条件。
  • @pcalkins 我想我的印象是,一旦用driver.get(url) 抓取页面,它就会作为静态对象存在,但如果它会继续加载它的元素,那么我的问题应该是有效的解决了。一旦我重新获得访问权限,我很想尝试一下......
  • 听起来像一个“延迟加载”网站,它会在页面完全加载后触发脚本来填充 DOM。

标签: python selenium selenium-webdriver


【解决方案1】:

我确信我的答案不是最好的,但这是我自己的代码的一部分,它帮助我解决了与您的问题类似的问题。

就我而言,我在加载 DOM 时遇到了问题。有时需要 5 秒有时需要 1 秒等等。

url = 'www.somesite.com'
browser.get(url)

因为在我的情况下browser.implicitly_wait(7) 还不够。我做了一个简单的for loop 来检查内容是否加载。

some code...

 for try_html in range(7):
        """ Make 7 tries to check if the element is loaded """
        browser.implicitly_wait(7)
        html = browser.page_source
        soup = BeautifulSoup(html, 'lxml')
        raw_data = soup.find_all('script', type='application/ld+json')
        

       """if SKU in not found in the html page we skip 
         for another loop, else we break the 
          tryes and scrape the page"""

        if 'sku' not in html:
            continue
        else:
            scrape(raw_data)
            break

它并不完美,但你可以试试。

【讨论】:

  • 谢谢@BBorisov95。我会坚持这个作为最后的手段。我想避免硬编码等待每个页面,因为这会使我的抓取速度减慢固定数量,而如果我可以告诉它等待某个值加载,那么理论上它应该动态等待只要是每个页面都需要。
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多