我已经尝试了几个小时从网站上未知数量的元素中提取文本。我上传了两张图片,这样你就可以看到元素的相似之处来识别它们。例如,它们具有相同的类名。黑色下划线的文本基本上就是我想要提取的文本。
我甚至还没有到提取文本的步骤,因为我甚至找不到元素。
这是我尝试过的一件事:
a=driver.find_elements_by_class_name("pooVf")
print(a)
我得到的结果是"[]"。
我也尝试过使用css选择器
a=driver.find_elements_by_css_selector("a.pooVf.prDW")
print(a)
还得到了"[]"。
我不知道如何将html代码添加为文本。我每次尝试都没用。
您是否尝试使用函数"text
";?
driver.find_elements_by_css_selector(".....").text
您是否尝试过使用元素的XPath而不是其CSS选择器或类名?我本想留下来作为评论,但我没有足够的声誉。
你能尝试使用吗
driver.find_element_by_css_selector("a.pooVf.prDW")
代替
driver.find_elements_by_css_selector("a.pooVf.prDW")
可能性:动态添加元素
由于延迟后在浏览器中手动检查DOM时该元素存在,但Selenium抱怨找不到它,因此我怀疑该元素是由JavaScript动态添加的。Selenium有处理这种情况的工具。查看他们的等待文档。
如今,大多数网络应用程序都在使用AJAX技术。当浏览器加载页面时,该页面中的元素可能会以不同的时间间隔加载。这使得定位元素变得困难:如果DOM中还没有元素,则定位函数将引发ElementNotVisibleException异常。使用等待,我们可以解决这个问题。等待在执行的操作之间提供了一些间隙——主要是定位元素或对元素进行任何其他操作。
一个选项是添加以下行,使所有find
方法在放弃之前等待几秒钟:
driver.implicitly_wait(5) # seconds
不要让延迟太长,因为如果元素真的不存在,你不想永远等待。使用Selenium的wait
功能比time.sleep
更好。一旦元素存在,就没有必要等待,但sleep
无法知道何时会发生这种情况,而对于implicitly_wait
,只要元素可用,代码就应该立即返回。
可能性:不同的会话/cookie
也许你正在寻找的元素取决于你的非无头Chrome连接所特有的信息(cookie、本地存储等(,而无头Chrome不可用。这就像使用两种不同的浏览器。尝试使用Chrome的隐身模式,看看在检查DOM时是否还能找到元素。如果这再现了问题(元素丢失(,那么这意味着您需要在Selenium代码中添加额外的行,以复制您在浏览器中所做的操作:也许使用登录页面上的凭据登录,单击一些上传按钮,等等。所有这些操作都需要编码到你的无头版本中——它们不能依赖于你在非无头Chrome中手动执行的操作。即便如此,您也可能难以使用所写的选择器:pooVf
、t3RpAe
、prDW
和Rgstwe
看起来都是非常独特、不可预测的字符串。如果您的操作序列(登录、上传(每次都会产生不同的字符串,那么您需要以不同的方式找到这些元素。也许可以更可靠地找到它们的父元素之一。