Xpath получает текстовое содержимое из нескольких сложных тегов - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть этот шаблон HTML:

<center>
    <img src="image1">
    <br><br>
    <img src="image2">
    <br><br>
    <strong><em>TITLE1 :</em></strong> DESC1<br>
    <strong><em>TITLE2 :</em></strong> DESC2<br>
    <strong><em>TITLE3 :</em></strong> DESC3<br>
    <strong><em>TITLE4 :</em></strong> DESC4<br>
    <strong><em>TITLE5 :</em></strong> DESC5<br><br><br>
    <img src="image3">
    <br><br><br>DESC_GEN
</center>

Я хочу использовать xpath для получения ожидаемого результата:

TITLE 1 = DESC 1
TITLE 2 = DESC 2
TITLE 3 = DESC 3
TITLE 4 = DESC 4
TITLE 5 = DESC 5
general = DESC_GEN

В массиве, чтобы я мог использовать значения в другом месте в моемcode.

Вот что я пробовал:

$dom = new DOMDocument();
$dom->loadHTML($html_string);
$xpath = new DOMXpath($dom);

$elements = $xpath->query("//em");
foreach($elements as $e) {
    echo $e->nodeValue . '<br/>';
}

Но, к сожалению, это возвращает только TITLE 1, TITLE 2, TITLE 3 и т. д.

Я хочу получить их соответствующиезначения (в данном случае DESC 1, DESC 2 и т. д.).

Какой подход я могу использовать для достижения этой цели?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

дойти до родителя em, что составляет strong или .. в xpah, затем выберите text()

$elements = $xpath->query("//em");
foreach($elements as $e) {
    $desc = $xpath->query("../following-sibling::text()", $e);
    echo $e->nodeValue . $desc[0]->nodeValue ."<br/>";
}
0 голосов
/ 21 ноября 2018

К вашему сведению, используемый вами HTML-шаблон не является правильно сформированным XML-документом.Это может вызвать или не вызвать проблемы в зависимости от вашего синтаксического анализатора.

Самый простой способ получить то, что вы хотите, это, вероятно, сначала получить список заголовков с помощью

//em/text()

Затем получить списокописания с

//em/following::text()[1]

Затем общее описание с

//center/text()[last()]

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


Обратите внимание, что фактические выражения xpath могут различаться в зависимости от конкретного HTML-документа.Однако вышеприведенное должно работать для предоставленного вами шаблона.

...