Абсолютный xpath выбирает неправильный элемент и текст внутри него - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь почистить некоторые данные с этой страницы: https://www.blockchain.com/btc/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

Я совершенно недоумеваю ...

Абсолютный путь для «Количество транзакций» это / html [1] / body [1] / div [1] / div [2] / div [1] / table [1] / tbody [1] / tr [2] / td [1]

Когда Iзапустите код:

print driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[2]/td[1]").text

Драйвер возвращает «Нет входов (вновь сгенерированных монет)»

, который имеет путь / html [1] / body [1] / div [1]/ div [3] / div [1] / таблица [1] / tbody [1] / tr [2] / td [1] / b [1]

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

Поэтому, когда я запускаю код:

print driver.find_element(By.XPATH, "/html[1]/body[1]/div[1]/div[3]/div[1]/table[1]/tbody[1]/tr[2]/td[1]/b[1]").text

Возвращает, что элемент не существует (?)

Ответы [ 2 ]

1 голос
/ 27 октября 2019

.text вернет весь текст в WebElement, включая текст потомков. Первый xpath возвращает элемент <td class="txtd hidden-phone mobile-f12 stack-mobile">, текст «No Inputs (New Generated Coins)» является его частью.

Второй xpath не работает, потому что он неправильный, div[3] должно быть div[2], в этом месте всего 2 <div> с.

* Использование абсолютного xpath - плохая практика, избегайте его.

0 голосов
/ 27 октября 2019

Это действительно странно;и Firefox, и Chrome показывают один и тот же xpath для этого элемента, но если вы получите страницу, используя requests, или посмотрите на ее источник, там нет элемента <tbody>. Правильное выражение xpath для получения количества транзакций (т. Е. 1):

   /html/body/div/div/div/table[1]/tr[2]/td[2]/text()

. В качестве объяснения, почему это работает, попробуйте следующее:

url = """
https://www.blockchain.com/btc/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
"""
import lxml
import requests
resp = requests.get(url)

tree = lxml.html.fromstring(resp.text)
print(tree.xpath("/html/body/div/div/div/table[1]/tr[2]/td[2]/text()")

Вывод:

['1', '\ n']

И, поскольку @Guy прав, и вам следует избегать абсолютных путей (и ваша ситуация - прекрасный пример того, почему),вы можете получить тот же результат, используя

print(tree.xpath("//table/tr[2]/td[2]/text()")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...