Python 使用Selenium获取页面,但等待未知元素值不为空 上下文
这是的一份复本,据我所知,该复本已关闭,没有任何有效性 闭包推理中的关联答案都依赖于知道预期的文本值。在每个答案中,它明确地显示了硬编码到Python 使用Selenium获取页面,但等待未知元素值不为空 上下文,python,selenium,selenium-webdriver,Python,Selenium,Selenium Webdriver,这是的一份复本,据我所知,该复本已关闭,没有任何有效性 闭包推理中的关联答案都依赖于知道预期的文本值。在每个答案中,它明确地显示了硬编码到WebDriverWait调用中的预期文本。此外,两个链接的答案都没有触及我问题的最后部分: [预期条件]出现在页面获取之前还是之后 “重复”问题 原始问题 我正在使用Selenium抓取一个网页,但我需要等待加载某个值。我不知道这个值是什么,只知道它将出现在什么元素中 似乎使用预期条件text\u to\u present\u in_element
WebDriverWait
调用中的预期文本。此外,两个链接的答案都没有触及我问题的最后部分:
[预期条件]出现在页面获取之前还是之后
“重复”问题
原始问题 我正在使用Selenium抓取一个网页,但我需要等待加载某个值。我不知道这个值是什么,只知道它将出现在什么元素中 似乎使用预期条件
text\u to\u present\u in_element\u value
或text\u to\u present\u in_element
是最有可能的方法,但我很难找到任何关于如何使用这些的实际文档,我不知道它们是在页面获取之前还是之后出现:
webdriver.get(url)
重新措辞
如何使用Selenium获取页面,但在继续之前等待未知文本值填充元素的文本或值?我确信我的答案不是最好的,但这里是我自己代码的一部分,它帮助我解决了与您的问题类似的问题 在我的例子中,DOM的加载时间有问题。有时需要5秒,有时需要1秒,以此类推
url = 'www.somesite.com'
browser.get(url)
因为在我的例子中,browser.implicitly\u wait(7)
不够。我做了一个简单的for循环
,检查内容是否已加载
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
它并不完美,但你可以试试。你能在元素出现之前和之后添加HTML吗?你看了吗?@MaximilianPeters我需要的特定元素似乎总是出现在已删除的文档中,只是其中没有文本值。当我在浏览器中加载页面时,在填充之前,该值为空一秒或两秒。我很想发布原始HTML,但我现在正在处理一个身份验证问题,阻止我登录该网站。一旦客户端修复其身份验证,我将使用原始HTML进行更新。你的相关问题看起来很有希望。一旦我被解锁,我会尝试一下。看起来你只是需要一个轮询循环。。。检查元素是否为空。如果不是,则继续。您不需要webdriverwait或预期的条件。@pcalkins我想我的印象是,一旦使用
driver.get(url)
抓取页面,它就作为静态对象存在,但是如果它将继续加载其元素,那么我的问题应该得到有效解决。一旦我重新获得访问权限,我很想尝试一下……听起来像是一个“延迟加载”网站,在页面完全加载后触发一个脚本来填充DOM。谢谢@BBorisov95。我会坚持这一点作为最后的手段。我希望避免硬编码等待每个页面,因为这将使我的抓取速度降低一个固定的量,而如果我可以告诉它等待某个值加载,那么理论上它应该动态地等待每个页面所需的时间。