[英]How to find element by <span> without class or title in selenium?
我需要获取一些文本内部span标签,但是span标签没有任何类或标题。 它就像:
<span>kirnath@me.com</span>
<span>kirnath2@me.com</span>
<span>kirnath3@me.com</span>
我试过使用:
driver.find_elements_by_xpath('//*[contains(text(), 'kirnath@me.com')]')
但是我得到了错误:
SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//*[contains(text(), kirnath@me.com)]' is not a valid XPath expression.
我需要得到:
kirnath@me.com
kirnath2@me.com
kirnath3@me.com
如果要所有跨度,请抓住webElements列表,并使用列表理解将.text从每个文本提取到列表中。 如果您不希望所有跨度,请查找一个关系/位置参数,例如,该参数限制为所需的值。 或者,如果您要使用一致的子字符串,甚至可以匹配.text上的子字符串。
span_texts = [item.text for item in driver.find_elements_by_css_selector('span')]
xpath子字符串
driver.find_elements_by_xpath('//span[contains(text(), "me.com")]')
您可以使用:contains bs4 4.7.1中的伪类来处理来自driver.page_source的html。 然后,您可以指定一个用于匹配span标签的子字符串
from bs4 import BeautifulSoup as bs
soup = bs(driver.page_source, 'lxml')
data = [item.text for item in soup.select('span:contains("@me.com")')]
print(data)
像这样: !?
inp="bla <span>kirnath@me.com</span> blub"
p1=inp.find("<span>")
p2=inp.find("</span>")
if p1>=0 and p2>p1:
print(inp[p1+len("<span>"):p2])
输出为:
kirnath@me.com
编辑:或者像这样进行更多匹配
inp="bla <span>kirnath@me.com</span><span>kirnath2@me.com</span><span>kirnath3@me.com</span> blub"
def find_all(inp):
res=[]
p=0
while True:
p1=inp.find("<span>", p)
p2=inp.find("</span>", p)
if p1>=0 and p2>p1:
res+=[inp[p1+len("<span>"):p2]]
p=p2+1
else:
return res
print(find_all(inp))
输出为:
['kirnath@me.com', 'kirnath2@me.com', 'kirnath3@me.com']
您正在对字符串内部和字符串外部的内部引号使用单引号。 在其中使用双引号。 或在引号前使用反斜杠。
尝试这个:
driver.find_elements_by_xpath('//*[contains(text(), "kirnath@me.com")]')
要么
driver.find_elements_by_xpath('//*[contains(text(), \'kirnath@me.com\')]')
这只会返回文本为kirnath@me.com
的元素。
查找您可以使用的任何电子邮件地址
driver.find_elements_by_xpath('//*[contains(text(), "@") and contains(text(), ".")]')
这将找到包含带有@
和文本的所有元素.
获取页面的所有span元素并不理想。 即使span
标记没有任何ID或类,其父节点也可能具有一些唯一的标识符。
您可以为页面源提供某些级别的父节点吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.