Я пишу общий проводник HTML, который может выполнять список операций, таких как страница посещения, найти таблицу, находить строки, хранить данные и т. Д. Он использует Goutte/Guzzle внутренне и, следовательно, может использовать селектора CSS и XPath , У меня есть интересная проблема, с которой я столкнулся в выборе нового набора результатов по сравнению с существующим набором результатов.Как получить текст родительского элемента относительно определенных найденных узлов HTML?
Рассмотрим демо HTML:
<h2>Burrowing</h2>
<ul>
<li>
<a href="/jobs/junior-mole">Junior Mole</a>
</li>
<li>
<a href="/jobs/head-of-badger-partnerships">Head of Badger Partnerships</a>
</li>
<li>
<a href="/jobs/trainee-worm">Trainee Worm</a>
</li>
</ul>
<h2>Tree Surgery</h2>
<ul>
<li>
<a href="/jobs/senior-woodpecker">Senior Woodpecker</a>
</li>
<li>
<a href="/jobs/owl-supervisor">Owl Supervisor</a>
</li>
</ul>
<h2>Grass maintenance</h2>
<ul>
<li>
<a href="/jobs/trainee-sheep">Trainee sheep</a>
</li>
<li>
<a href="/jobs/sheep-shearer">Sheep shearer</a>
</li>
</ul>
<h2>Aerial supervision</h2>
<ul>
<li>
<a href="/jobs/head-magpie-ops">Head of Magpie Operations</a>
</li>
</ul>
Я бегу этот CSS запрос, чтобы получить роль в связях (это правильно получает восемь элементов):
ul li a
Для каждого из них, я бы как получить категорию, которая является <h2>
, непосредственно предшествующей <ul>
в каждом случае. Теперь я мог бы сделать это с абсолютным селектором CSS, таким образом:
h2
Однако это получает четыре результата, так что я не знаю, к какой категории (h2) идет с какой работой (по ссылке). Мне нужно получить восемь результатов: три лота первой категории, две из вторых, две из третьей и одна четвертая, поэтому каждая категория отображается на каждую роль.
Интересно, если я должен был бы родительский селектор для этого, поэтому я перешел из CSS в XPath, и первым попытался это, который получает каждый h2, имеющий сразу после элемента списка:
//h2[(following-sibling::ul)[1]/li/a]
Это находит H2S имея указанную родительскую структуру, но снова возвращается с четырьмя результатами - ничего хорошего.
Следующая попытка:
//ul/li[../preceding-sibling::h2[1]]
Это получает нужное количество результатов (на основе получения элемента списка с непосредственно предшествующим названием), но получает текст ссылки, а не категория текста.
Я думал о выполнении цикла - я знаю, что у меня есть восемь результатов, поэтому я мог бы это сделать (X - это впрыскиваемая переменная, петляющая от 1 до 8). Это работает, но я считаю добавление ручного контура здесь довольно безвкусным - Я стараюсь, чтобы мои правила, как общие, как это возможно:
//li[X]/../preceding-sibling::h2[1]
Есть ли операция XPath, которая может вернуть требуемые результаты? Во избежании недоразумений я ищу следующий (или только текстовые элементы были бы отлично):
<h2>Burrowing</h2>
<h2>Burrowing</h2>
<h2>Burrowing</h2>
<h2>Tree Surgery</h2>
<h2>Tree Surgery</h2>
<h2>Grass maintenance</h2>
<h2>Grass maintenance</h2>
<h2>Aerial supervision</h2>
CSS будет тоже хорошо, но я предполагаю, что это не возможно, потому что CSS не имеет родителя оператор (в любом случае Goutte просто преобразует селектора CSS в селектора XPath).
Поскольку я на PHP (5.5), я считаю, что я должен придерживаться XPath 1.0.
Незаконченное тему ... то, что случилось с вашей репутации? – prodigitalson
Возможно, вы другой пользователь? «Халфер», который раньше видел, был в высоких десятках тысяч ... Мне так очень не повезло ... – prodigitalson
@prodigitalson: Не я, еще не сломал линию 10K! Почти там ... – halfer