Как найти элемент по <span>без класса или заголовка в селене? - PullRequest
0 голосов
/ 18 апреля 2019

Мне нужно получить текстовый внутренний тег 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 ]

2 голосов
/ 18 апреля 2019

Если вы хотите, чтобы все промежутки, тогда захватите список 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 для обработки HTML-кода из driver.page_source. Затем вы можете указать подстроку для соответствия тегам 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)
0 голосов
/ 18 апреля 2019

Вы используете одинарную кавычку как для внутренней цитаты внутри строки, так и за ее пределами.используйте двойные кавычки для текста внутри.Или используйте обратную косую черту перед цитатой.

Попробуйте:

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 нет идентификатора или класса, его родительские узлы могут иметь некоторый уникальный идентификатор.

Можете ли вы предоставить источнику страницы несколько уровней родительских узлов?

0 голосов
/ 18 апреля 2019

Вот так:!?

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...