Python Selenium,Xpath,选择节点中文本的某一部分
我有一个如下的源文件:Python Selenium,Xpath,选择节点中文本的某一部分,python,selenium,xpath,Python,Selenium,Xpath,我有一个如下的源文件: <div class="l_post j_l_post l_post_bright " ...> <div class="lzl_cnt"> ... <span class="lzl_content_main"> text1 <a class="at j_user_card" username="..."> username </a> text3 </spa
<div class="l_post j_l_post l_post_bright " ...>
<div class="lzl_cnt">
...
<span class="lzl_content_main">
text1
<a class="at j_user_card" username="...">
username
</a>
text3
</span>
</div>
...
</div>
但是我有
消息:选择器无效:xpath表达式的结果
“//span[@class=“lzl\u content\u main”]/text()[1]”是:[对象文本]
应该是一个要素”
有没有办法获取“text3”
我应该说得更清楚:
上面的HTML是更大结构的一部分,我使用以下python代码将其选中:
for sel in driver.find_elements_by_css_selector('div.l_post.j_l_post.l_post_bright'):
for i in sel.find_elements_by_xpath('.//div[@class="lzl_cnt"]'):
#user1 = i.find_element_by_xpath('.//a[@class="at j_user_card "]').text
try: user2 = i.find_element_by_xpath('.//span[@class="lzl_content_main"]/a[@username]').text
except: user2 = ""
text3 = ???
print(user2, text3)
是的:
然后您应该在该元素上使用.text
除非span没有关闭,所以假设它在div之前关闭。在selenium中,不能使用返回属性或文本节点的XPath,因此不允许使用
/text()
语法。如果只想获取特定的子文本节点而不是完整的文本内容(由text
property返回),可以执行JavaScript
您可以应用以下代码来获取所需的文本节点:
...
try: user2 = i.find_element_by_xpath('.//span[@class="lzl_content_main"]/a[@username]').text
except: user2 = ""
span = i.find_element_by_xpath('.//span[@class="lzl_content_main"]')
reply = driver.execute_script('return arguments[0].lastChild.textContent;', span)
您可能还需要执行
reply=reply.strip()
以去除尾随空格这里我为您回答一个解决方案
List<WebElement> list = driver.findElements(By.tagName("span"));
for(WebElement el : list){
String desiredText = el.getAttribute("innerHTML");
if(desiredText.equalsIgnoreCase("text3")){
System.out.println("desired text found");
break;
}
}
List List=driver.findElements(按.tagName(“span”);
for(WebElement el:list){
字符串desiredText=el.getAttribute(“innerHTML”);
如果(需要文本同等信号情况(“文本3”)){
System.out.println(“找到所需文本”);
打破
}
}
请使用上面的代码,并让我知道您的反馈。您可以更新您的HTML示例吗?它看起来很简单broken@Andersson哦Sorry@YoarkYANG我为你补充了一个答案。请尝试一下,并让我知道您的反馈再次更新您的HTML示例:
a
节点没有@username
,“text3”
不是节点的一部分…@Andersson实际上,节点有@username
,(我没有写出来,因为我认为这与具体问题无关,但如果你们感到困惑,我会更新他们)text3不是节点的一部分,它是span节点的一部分:text1,text3是span节点的一部分,但它们被a节点拆分了a节点
它似乎是一个Python-没有getText
编辑这样的属性,现在是。text抱歉,我没有说清楚:我使用Python,谢谢ways@YoarkYANG用逻辑,把所有元素都取出来带有span的标记名。然后在列表中写一个循环,内部循环得到innerHTML值。如果找到需要的文本,请看一看,谢谢!成功了!还发现我的代码有更多问题…虽然我自己似乎可以解决,再次感谢!是时候让我学习一些JS了。。。
...
try: user2 = i.find_element_by_xpath('.//span[@class="lzl_content_main"]/a[@username]').text
except: user2 = ""
span = i.find_element_by_xpath('.//span[@class="lzl_content_main"]')
reply = driver.execute_script('return arguments[0].lastChild.textContent;', span)
List<WebElement> list = driver.findElements(By.tagName("span"));
for(WebElement el : list){
String desiredText = el.getAttribute("innerHTML");
if(desiredText.equalsIgnoreCase("text3")){
System.out.println("desired text found");
break;
}
}