Как определить выражение xpath, которое извлекает только дефисные элементы из первого из двух похожих div? - PullRequest
3 голосов
/ 31 октября 2010

Приведенные ниже элементы div отображаются в указанном порядке в HTML-коде, который я анализирую.

//div[contains(@class,'top-container')]//font/text()

Я использую приведенное выше выражение xpath, чтобы попытаться получить любые данные в первом элементе div, ниже которого дефисиспользуется для разграничения данных:

Wednesday - Chess at Higgins Stadium
Thursday - Cook-off

Проблема в том, что я получаю данные из второго нижеприведенного div, например:

Monday 10:00 - 11:00
Tuesday 10:00 - 11:00

Как получить данные только из первого div?(Я также хочу исключить любые элементы в первом div, которые не содержат эти данные через дефис)?

<div class="top-container"> 
<div dir="ltr"> 
<div dir="ltr"><font face="Arial" color="#000000" size="2">Wednesday - Chess at Higgins Stadium</font></div> 
<div dir="ltr"><font face="Arial" size="2">Thursday - Cook-off</font></div> 
<div dir="ltr"><font face="Arial" size="2"></font>&nbsp;</div> 
<div dir="ltr">&nbsp;</div> 
<div dir="ltr"><font face="Arial" color="#000000" size="2"></font>&nbsp;</div>
</div> 

<div dir="ltr"> 
<div RE><font face="Arial"> 
<div dir="ltr"> 
<div RE><font face="Arial" size="2"><strong>Alex Dawkin </strong></font></div> 
<div RE><font face="Arial" size="2">Monday 10:00 - 11:00 </font></div> 
<div RE><font size="2">Tuesday 10:00 - 11:00 </font></div> 
<div RE> 
<div RE><font face="Arial" size="2"></font></div><font face="Arial" size="2"></font></div> 
<div RE>&nbsp;</div> 
<div RE>&nbsp;</div> 

1 Ответ

1 голос
/ 31 октября 2010

Ваш XPATH совпадает с любым font элементом, который является потомком <div class="top-container">.

div[1] будет обращаться к первому div дочернему элементу элемента "top-container". Если вы добавите это в XPATH, он вернет желаемые результаты.

//div[contains(concat(' ',@class,' '),' top-container '))]/div[1]//font/text()

Если вы хотите убедиться, что адресованы только text() узлы, содержащие "-", то вам также следует добавить фильтр предикатов к text().

//div[contains(concat(' ',@class,' '),' top-container '))]/div[1]//font/text()[contains(.,'-')]

Вместо проверки только на узлы которые содержат "-", как бы вы изменили последнее выражение, чтобы просто проверить непустые строки?

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

Однако, , если вы хотите выбрать только text() узлы, содержащие текст, отличный от пробела , вы можете использовать это выражение:

//div[contains(concat(' ',@class,' '),' top-container '))]/div[1]//font/text()[normalize-space()]

normalize-space() удаляет все начальные и конечные пробельные символы. Таким образом, если text() содержит только пробелы (включая &nbsp;), результат будет нулевым и будет равен false() в фильтре предикатов, поэтому будет выбран только text(), содержащий что-то отличное от пробелов.

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