Разбор HTML с HTML DOMDocument PHP - PullRequest
       26

Разбор HTML с HTML DOMDocument PHP

22 голосов
/ 03 апреля 2010

Я пытался сделать это с помощью «getElementsByTagName», но это не сработало, я новичок в использовании DOMDocument для разбора HTML, так как раньше я использовал регулярные выражения, пока вчера некоторые добрые шутки говорили мне, что DOMEDocument лучше для работы, поэтому я попробую :))

Я некоторое время гуглял в поисках некоторых объяснений, но не нашел ничего, что помогло (во всяком случае, с классом)

Итак, я хочу захватить «Захватить этот текст 1» и «Захватить этот текст 2» и т. Д.

Не выглядит трудно, но я не могу понять: (

<div class="main">
    <div class="text">
    Capture this text 1
    </div>
</div>

<div class="main">
    <div class="text">
    Capture this text 2
    </div>
</div>

Ответы [ 2 ]

51 голосов
/ 03 апреля 2010

Если вы хотите получить:

  • Текст
  • внутри тега <div> с class="text"
  • это само по себе внутри <div> с class="main"

Я бы сказал, что самый простой способ - не использовать DOMDocument::getElementsByTagName - который будет возвращать все теги с определенным именем (хотя вам нужны только некоторые из их) .

Вместо этого я бы использовал XPath-запрос к вашему документу, используя класс DOMXpath.


Например, что-то вроде этого должно сделать, чтобы загрузить строку HTML в объект DOM, и экземпляр класса DOMXpath:

$html = <<<HTML
<div class="main">
    <div class="text">
    Capture this text 1
    </div>
</div>

<div class="main">
    <div class="text">
    Capture this text 2
    </div>
</div>
HTML;

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);


И затем вы можете использовать запросы XPath с методом DOMXPath::query, который возвращает список элементов, которые вы искали:

$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
    var_dump(trim($tag->nodeValue));
}


И выполнение этого дает мне следующий вывод:

string 'Capture this text 1' (length=19)
string 'Capture this text 2' (length=19)
1 голос
/ 12 марта 2014

Вы можете использовать http://simplehtmldom.sourceforge.net/

Очень просто и просто использовать DOM-парсер, написанный на php, с помощью которого вы можете легко получить содержимое тега div.

Примерно так:

// Find all <div> which have attribute id=text
$ret = $html->find('div[id=text]'); 

См. Документацию для получения дополнительной помощи.

...