我有一个这样的源文件:
<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>
我想得到 text3 ,目前,我试过这个:(我在<div class="lzl_cnt">
)
driver.find_element(By.XPATH,'.//span[@class="lzl_content_main"]/text()[1]')
但我得到了
“消息:无效的选择器:xpath表达式的结果 “.//span[@class="lzl_content_main"]/text()[1]”是:[object Text]。它 应该是一个元素“。
有没有办法获得"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)
答案 0 :(得分:1)
是:
//div[@class='lzl_cnt']
然后你应该在该元素上使用.text
除非你的跨度没有关闭,所以假设它在div之前关闭。
答案 1 :(得分:1)
在selenium中,您无法使用返回属性或文本节点的XPath,因此不允许使用/text()
语法。如果只想获取特定的子文本节点而不是完整的文本内容(由text
属性返回),则可以执行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()
来摆脱尾随空格
答案 2 :(得分:0)
我在这里为您解答一个解决方案。
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;
}
}
请使用上述代码并告诉我您的反馈意见。