如何在硒元素中不带类别和标题的<span>找到元素?

2024-05-18 05:36:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一些文本内部span标记,但span标记没有任何类或标题。 就像:

<span>kirnath@me.com</span>
<span>kirnath2@me.com</span>
<span>kirnath3@me.com</span>

我试过使用:

^{pr2}$

但我出错了:

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

Tags: to标记文本com标题executemespan
3条回答

字符串内部和外部的内部引号都使用单引号。对里面的文字使用双引号。或者在引用之前使用反斜杠。在

试试这个:

driver.find_elements_by_xpath('//*[contains(text(), "kirnath@me.com")]')

或者

^{pr2}$

这将只返回带有文本kirnath@me.com的元素。在

查找您可以使用的任何电子邮件地址

driver.find_elements_by_xpath('//*[contains(text(), "@") and contains(text(), ".")]')

这将找到包含@.文本的所有元素

获取页面的所有span元素并不理想。即使span标记没有任何id或类,它的父节点可能有一些唯一的标识符。在

你能为页面源提供一些级别的父节点吗?在

像这样:!?在

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])

输出为:

^{pr2}$

编辑:或类似这样,以获取更多匹配项

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']

如果您想要所有跨距,那么抓取webElements列表并使用list comprehension将.text从每个列表中提取到一个列表中。如果不需要所有跨距,请查找关系/位置参数,例如限制到所需的范围。或者甚至可能在.text上匹配子字符串,如果您有一个一致存在的子字符串可供使用。在

span_texts = [item.text for item in driver.find_elements_by_css_selector('span')]

xpath子字符串

^{pr2}$

您可以使用:contains pseudo class from bs4.7.1来处理driver.page_源. 然后可以为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)

相关问题 更多 >