我需要获取一些文本内部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
答案 0 :(得分:2)
如果要所有跨度,请获取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")]')
您可以使用:包含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)
答案 1 :(得分:0)
就像这样:!?
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']
答案 2 :(得分:0)
您正在对字符串内部和字符串外部的内部引号使用单引号。在其中使用双引号。或在引号前使用反斜杠。
尝试一下:
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或类,其父节点也可能具有一些唯一的标识符。
您可以为页面源提供某些级别的父节点吗?