如何在硒中没有类或标题的情况下按<span>查找元素?

时间:2019-04-18 08:55:44

标签: python html selenium web-scraping beautifulsoup

我需要获取一些文本内部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

3 个答案:

答案 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或类,其父节点也可能具有一些唯一的标识符。

您可以为页面源提供某些级别的父节点吗?