2014-01-29 3 views
0

У меня есть XPATH запрос:Получить все HREFS от конкретного запроса XPATH

$q = $xpath->query("//p[@id='v{$versenumber}']/following-sibling::div[@class='admonition']"); 

, который работает хорошо, очень хорошо на самом деле. И я, используя следующие извлечь HTML я получаю от него:

$saveHTML = $dom->saveHTML($q->item(0));

Однако внутри этого запроса у меня есть HREFS, что я хочу, чтобы заменить чем-то другим. У меня возникают проблемы с фактическим признанием hrefs. Я думал о том, что другой вопрос будет таким же, но с /a в конце, но это ничего не вернуло.

Я бы думал, что я мог бы получить доступ к ним, как это:

$x = $q->item(0)->getElementByTagName('a');

Но то не похоже на работу либо :(Что я делаю неправильно

обновление

? HTML Я хочу разобрать:

<p id="v1"><span class="verseref">1</span></p> 
<div class="notes"> 
<p class="first">Notes</p> 
<p class="last">Paragraph</p> 
</div> 
<div class="admonition"> 
<p class="last">HTML with <a href='foobar'>inside it</a>. I want to get all href attributes from here.</p> 
</div> 

И используя вышеприведенный запрос, я могу получить текст в порядке, просто я хочу иметь дело с каждым атрибутом «href», поскольку они ошибочны, и мне нужно их изменить. Поэтому я имею дело с каждым <div class'admonition'> отдельно, и все hrefs внутри них.

Однако с помощью:

$q = $xpath->query("//p[@id='v{$versenumber}']/following-sibling::div[@class='admonition']//a/@href");

Я, кажется, получают огромное количество HREF в течение одного пункта, где есть только один.

../../ga/ch1/#v1 
#v6 
#v5 
#v6 
../../mr/ch16/#v20 
../ch12/ 
../../heb/ch13/#v9 
../ch12/ 
../ch3/#v1 
../../lu/ch1/#v6 
../../1jo/ch1/#v8 
../../1jo/ch1/#v10 
../../1jo/ch1/#v7 
../../1jo/ch1/#v9 
#v1 
../../eph/ch4/#v13 
../../ro/ch14/ 
../../ro/ch14/#v1 
../ch5/ 
../ch6/ 
../ch7/ 
../ch8/ 
../ch11/ 
../ch12/ 
../ch15/ 
../../ro/ch14/ 
#v12 
../ch3/#v4 
../ch15/#v24 
../../eph/ch5/#v17 
../../ro/ch8/#v6 
../../../ot/ge/ch11/#v3 
../../../ot/ps/ch133/ 
../../../ot/jer/ch32/#v39 
../../ac/ch4/#v32 
../../ro/ch12/#v16 
../../ro/ch15/#v5 
../../php/ch1/#v27 
../../php/ch2/#v1 
../../1th/ch5/#v13 
../../jas/ch3/#v13 
../../1pe/ch3/#v8 
../../eph/ch4/#v13 
../ch16/#v15 
../ch16/#v17 
../ch16/#v24 
../../ac/ch18/#v12 
../ch16/#v15 
../ch16/#v17 
../../ac/ch11/#v18 
../../mt/ch28/#v19 
../../mt/ch26/#v2 
../ch2/#v14 
../../ro/ch1/#v16 
../../ro/ch1/#v16 
../../2co/ch4/#v3 
#v17 
../../ac/ch20/#v30 
#v18 
../../../ot/isa/ch29/#v14 
../../../ot/isa/ch29/#v14 
../../../ot/isa/ch29/#v13 
../ch2/#v14 
../../ro/ch10/#v10 
#v21 
#v26 
../ch2/ 
#v18 
#v11 
../../lu/ch6/#v38 
../../../ot/ps/ch14/#v1 
../../../ot/ps/ch53/#v1 
../../col/ch2/#v3 
#v23 
#v18 
../../ac/ch5/#v34 
../../ac/ch26/#v24 
../../ga/ch2/#v1 
#v26 
#v25 
../../ac/ch24/#v25 
../../2co/ch10/#v12 
../../ro/ch7/#v18 
#v30 
../../ro/ch7/#v18 
../../joh/ch8/#v44 
../../mt/ch26/#v41 
../../ro/ch8/#v18 
#v26 
../../../ot/isa/ch42/#v8 
../../joh/ch3/#v3 
../../../ot/pr/ch3/#v6 
../../ro/ch8/#v23 
#v26 

..Which должен быть весь документ, в противном случае я не знаю, где он получает все эти hrefs из.

+0

могли бы вы предоставить фрагмент кода в HTML, который вы пытаетесь разобрать? Что-то вроде '// p [@ id = 'v {$ versenumber}']/next-sibling :: div [@ class = 'admonition'] // a/@ href' не выбирает то, что вы ищете ? – Robin

+0

Я только что попробовал это. И я получаю значения, но несколько значений, где должен быть только один href в блоке текста. Казалось бы, это может быть ссылка на весь документ вперед или что-то в этом роде? – Chud37

+1

'next-sibling :: div [@ class = 'admonition']' будет выбирать ВСЕ следующие div с классом, равным 'admonition', а не только следующим. Наверное, ты уже это знаешь, но здесь сложно получить точную идею. Можете ли вы предоставить часть того, что вы хотите проанализировать, а также то, что является результатом вашего решения и что вы хотите? – Robin

ответ

1

following-sibling - это ось, а не селектор, она просто определяет режим навигации через DOM. Ваш following-sibling::div[@class='admonition'] просит все «Предупреждение» div s, которые следуют (на любом расстоянии) выбранный p. Функция position() должна помочь вам решить эту проблему. Попробуйте что-то вроде following-sibling::div[@class='admonition' and position()=1].

+0

Ааа! что будет иметь смысл, поскольку я только ссылаюсь на элемент '-> (0)'. Я попробую это! – Chud37

+0

Гений!Огромное спасибо. Он работал красиво. – Chud37

Смежные вопросы