Я несколько (или очень) запутался в следующем:
from selenium.webdriver import Chrome
driver = Chrome()
html_content = """
<html>
<head></head>
<body>
<div class='first'>
Text 1
</div>
<div class="second">
Text 2
<span class='third'> Text 3
</span>
</div>
<div class='first'>
Text 4
</div>
<my_tag class="second">
Text 5
<span class='third'> Text 6
</span>
</my_tag>
</body>
</html>
"""
driver.get("data:text/html;charset=utf-8,{html_content}".format(html_content=html_content))
Я пытаюсь найти каждый элемент span
, используя xpath, распечатать его текст, а затем распечатать текст родительского элемента этого элемента. Окончательный результат должен быть примерно таким:
Text 3
Text 2
Text 6
Text 5
Я могу получить текст span
, например:
el = driver.find_elements_by_xpath("*//span")
for i in el:
print(i.text)
С выводом:
Text 3
Text 6
Но когда я пытаюсь получить текст родителя (и только родителя), используя:
elp = driver.find_elements_by_xpath("*//span/..")
for i in elp:
print(i.text)
Вывод:
Text 2 Text 3
Text 5 Text 6
Выражения xpath *//span/..
и //span/../text()
обычно (но не всегда, в зависимости от того, какой сайт теста xpath используется) оцениваются как:
Text 2
Text 5
, что мне нужно для моего for
цикла.
Отсюда путаница. Итак, я думаю, что я ищу, это цикл for
, который в псевдокоде выглядит следующим образом:
el = driver.find_elements_by_xpath("*//span")
for i in el:
print(i.text)
print(i.parent.text) #trying this in real life raises an error....