Поиск документа HTML в PHP - PullRequest
       12

Поиск документа HTML в PHP

3 голосов
/ 10 октября 2010

Я пытаюсь использовать DOMDocument и XPath для поиска в HTML-документе с использованием PHP.Я хочу выполнить поиск по номеру, например «022222», и он должен вернуть значение соответствующего тега h2.Любые мысли о том, как это будет сделано?

HTML-документ можно найти на http://pastie.org/1211369

Ответы [ 2 ]

2 голосов
/ 11 октября 2010
I want to search by a number such as '022222', and it should return the value of the corresponding h2 tag. Any thoughts on how this would be done?

The HTML document can be found at http://pastie.org/1211369

Начнем с того, что текст по предоставленной ссылке не является правильно сформированным документом XML или XHtml и не может быть напрямую проанализирован с XPath.

Поэтому я завернул его в <html> элемент.

В этом XML-документе одно из выражений XPath, которое точно выбирает нужный текстовый узел, является :

/*/div[div/ul/li = '022222']/div[@class='content']/h2/text()

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

Полный XML-документ, по которому оценивается это выражение XPath, выглядит следующим образом:

<html>
 <div class="item">
    <div class="content"><h2>Item 1</h2></div>
    <div class="phone">
        <ul class="phone-single">
            <li>01234 567890</li>
        </ul>
    </div>
 </div>

 <div class="item">
    <div class="content"><h2>Item 2</h2></div>
    <div class="phone">
        <ul class="phone-multiple">
        <li>022222</li>
            <li>033333</li>
        </ul>
    </div>
 </div>

 <div class="item">
    <div class="content"><h2>Item 3</h2></div>
    <div class="phone">
        <ul class="phone-single">
            <li>02345 678901</li>
        </ul>
    </div>
 </div>

 <div class="item">
    <div class="content"><h2>Item 4</h2></div>
    <div class="phone">
        <ul class="phone-multiple">
            <li>099999999</li>
            <li>088888888</li>
        </ul>
    </div>
 </div>
</html>
2 голосов
/ 10 октября 2010

Как насчет этого?

$sxml = simplexml_load_string($data);
$find = "022222";

print_r($sxml->xpath("//li[.='".$find."']/../../../div[@class='content']/h2"));

Возвращает:

Array
(
    [0] => SimpleXMLElement Object
        (
            [0] => Item 2
        )

)

//li[.='xxx'] найдет li, который вы ищете. Затем мы используем ../, чтобы подняться на три уровня, прежде чем мы опустимся в content-div, как указано div[@class='content'] Наконец мы выбираем ребенка h2.

Просто к вашему сведению, вот как это сделать, используя DOM:

$dom = new DOMDocument();
$dom->loadXML($data);

$find = "022222";

$xpath = new DOMXpath($dom);
$res = $xpath->evaluate("//li[.='".$find."']/../../../div[@class='content']/h2");

if ($res->length > 0) {
    $node = $res->item(0);
    echo $node->firstChild->wholeText."\n";
}
...