Как справиться с очень длинным XPATH? Есть ли альтернатива этому? - PullRequest
0 голосов
/ 05 мая 2020

выделенный текст

// div [@ class = 'preheader'] // follow-sibling :: table / tbody / tr [7] / td / table [1] / tbody / tr / td / table / tbody / tr / td / table / tbody / tr / td / table / tbody / tr / td / table / tbody / tr [4] / td / table / tbody / tr / td [1] / table / tbody / tr / td / table / tbody / tr / td / table / tbody / tr / td

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Нет более короткого выражения XPath, точно эквивалентного этому.

Существуют более короткие XPath, которые могут давать одинаковый результат в некоторых документах, но нет XPath, который давал бы одинаковый результат в каждом возможный документ.

Если вас интересует только один конкретный документ, то путь вроде (//*)[872] может дать вам правильный элемент. Но обычно весь смысл использования XPath состоит в том, чтобы найти выражение, которое по-прежнему работает, если документ немного отличается. Для этого необходимо знать структуру класса документов, которые вы хотите запросить; и действительно, намерение запроса.

0 голосов
/ 05 мая 2020

Да, если все наследие целевого элемента не имеет значения, его можно легко исключить с помощью оси descendent-or-self (//) или с помощью подстановочных знаков элемента *; конечно, любой из них можно комбинировать с предикатами:

Вот несколько примеров; вы можете выбрать через ...

  • значение атрибута id: //td[@id="wantedId"]
  • строковое значение: //td[.="targeted text"]
  • смежный текст: //td[preceding-sibling::td[1]="targeted label"]
  • частичное наследие: //div[@id="d1"]/table[@id='t1']//tr[2]/td[1]

Однако, как вы можете видеть, то, как именно сокращать, зависит от контекста целевого узла и от того, как этот контекст может варьироваться в разных экземплярах документа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...