Проблема с использованием Xpath «начинается с» для анализа xhtml - PullRequest
4 голосов
/ 01 февраля 2011

Я пытаюсь разобрать веб-страницу, чтобы получать сообщения с форума.
Начало каждого сообщения начинается со следующего формата

<div id="post_message_somenumber">

, и я хочу получить только первое

Я пытался xpath='//div[starts-with(@id, '"post_message_')]' в yql, но безуспешно
Я все еще учусь этому, у всех есть предложения

Ответы [ 3 ]

5 голосов
/ 14 августа 2012

Мне кажется, у меня есть решение, которое не требует работы с пространствами имен.

Вот тот, который выбирает все соответствующие div :

//div[@id[starts-with(.,"post_message")]]

Но вы сказали, что хотели только «первый» (я полагаю, вы имеете в виду первый «удар» на всей странице?). Вот небольшая модификация, которая выбирает только первый соответствующий результат :

(//div[@id[starts-with(.,"post_message")]])[1]

Они используют точку для представления значения идентификатора в функции starts-with(). Возможно, вам придется избегать специальных символов на вашем языке.

У меня отлично работает в PowerShell:

# Load a sample xml document
$xml = [xml]'<root><div id="post_message_somenumber"/><div id="not_post_message"/><div id="post_message_somenumber2"/></root>'

# Run the xpath selection of all matching div's
$xml.selectnodes('//div[@id[starts-with(.,"post_message")]]')

Результат:

id
--
post_message_somenumber
post_message_somenumber2

Или только для первого матча:

# Run the xpath selection of the first matching div
$xml.selectnodes('(//div[@id[starts-with(.,"post_message")]])[1]')

Результат:

id
--
post_message_somenumber
5 голосов
/ 01 февраля 2011

Я пытался xpath='//div[starts-with(@id, '"post_message_')]' в YQL без успех я все еще учусь этому, у кого есть предложения

Если проблема не из-за множества вложенных апострофов и незамкнутых двойных кавычек, то наиболее вероятная причина (мы можем только догадываться, не отображая документ XML) - это использование пространства имен по умолчанию.

Указание имен элементов, находящихся в пространстве имен по умолчанию, является наиболее часто задаваемыми вопросами в XPath. Если вы ищете «пространство имен XPath по умолчанию» в SO или в Интернете, вы найдете много источников с правильным решением.

Как правило, должен быть вызван специальный метод, который связывает префикс (скажем, "x:") с пространством имен по умолчанию. Затем в выражении XPath каждое имя элемента "someName" должно быть заменено на "x:someName.

Вот хороший ответ , как это сделать в C # .

Прочитайте документацию вашего языка / xpath-engine, как нечто подобное должно быть сделано в вашей конкретной среде.

1 голос
/ 14 декабря 2016
@FindBy(xpath = "//div[starts-with(@id,'expiredUserDetails') and contains(text(), 'Details')]") 
private WebElementFacade ListOfExpiredUsersDetails;

Этот список содержит список всех элементов на странице, которые имеют идентификатор expiredUserDetails, а также содержит текст или элемент Details

...