Как я анализирую частичный HTML?

Я пытаюсь проанализировать некоторый HTML с DOM в PHP, но у меня есть некоторые проблемы. Во-первых, в случае, если это изменение, решением, HTML, который я имею, не является полная страница, скорее это - только часть его.

<!-- This is the HTML that I have --><a href='/games/'>
<div id='game'>
<img src='http://images.example.com/games.gif' width='300' height='137' border='0'>
<br><b> Game </b>
</div>
<div id='double'>
<img src='http://images.example.com/double.gif' width='300' height='27' border='0' alt='' title=''>
</div>
</a>

Теперь я пытаюсь получить только отделение с идентификатором double. Я попробовал следующий код, но это, кажется, не работает правильно. Что я мог бы делать неправильно?

//The HTML has been loaded into the variable $html
$dom=new domDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false; 
$keepme = $dom->getElementById('double'); 

$contents = '<div style="text-align:center">'.$keepme.'</a></div>';
echo $contents;
18
задан waiwai933 19 December 2009 в 17:46
поделиться

5 ответов

Я думаю, что DOMDocument :: getElementById не будет работать в вашем случае: (цитата)

Чтобы эта функция работала, вы должны необходимо либо установить некоторые атрибуты идентификатора с DOMElement :: setIdAttribute или DTD, который определяет атрибут, который должен быть типа ID.
В последнем случае вы нужно будет подтвердить ваш документ с DOMDocument :: validate или DOMDocument-> validateOnParse перед с помощью этой функции.


Решение, которое может сработать, - это использование некоторого запроса XPath для извлечения искомого элемента.

Прежде всего, давайте загрузим часть HTML, как вы вначале:

$dom=new domDocument;
$dom->loadHTML($html);
var_dump($dom->saveHTML());

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


Затем создайте экземпляр класса DOMXPath , и используйте его для запроса элемента, который вы хотите получить:

$xpath = new DOMXpath($dom);
$result = $xpath->query("//*[@id = 'double']");
$keepme = $result->item(0);

Теперь нам нужно выбрать нужный вам элемент; -)


Но, чтобы вставить его HTML-содержимое в другой HTML-сегмент, мы должны сначала получить его HTML-контент .

Я не помню какой-либо "легкий" способ сделать это, но что-то вроде этого может помочь:

$tempDom = new DOMDocument();
$tempImported = $tempDom->importNode($keepme, true);
$tempDom->appendChild($tempImported);
$newHtml = $tempDom->saveHTML();
var_dump($newHtml);

И ... У нас есть HTML-содержимое вашего double

:

string '<div id="double">
<img src="http://images.example.com/double.gif" width="300" height="27" border="0" alt="" title="">
</div>
' (length=125)


Теперь,вы просто должны делать с ним все, что хотите; -)

13
ответ дан 30 November 2019 в 09:18
поделиться

From DomDocument :: getElementById

Чтобы эта функция работала, вы должны необходимо либо установить некоторые атрибуты идентификатора с DOMElement :: setIdAttribute или DTD, который определяет атрибут, который должен быть типа ID. В последнем случае вы нужно будет подтвердить ваш документ с DOMDocument :: validate или DOMDocument-> validateOnParse перед с помощью этой функции.

Для получения дополнительной информации

И поскольку кто-то упомянет выполнение этого с помощью обычного Выражение рано или поздно, вот шаблон, который вы могли бы использовать: /

(. *) <\ / Div> / simU

Кроме того, вы могли бы просто использовать обычные строковые функции для извлеките часть div, например

$div = strstr($html, '<div id="double">');
$div = substr($div, 0, strpos($div, '</div>') + 6);
echo $div;

. Хотя я согласен, вам не следует использовать функции RegEx или String для синтаксического анализа HTML или XML, я считаю, что это абсолютно нормально, , пока ваш единственный забота состоит в том, чтобы получить этот единственный div из фрагментов. Будьте проще.

3
ответ дан 30 November 2019 в 09:18
поделиться

HTML Tidy должен быть способен "исправлять" сломанные и фрагментированные HTML-документы, превращая их во что-то, что можно анализировать с помощью других инструментов

http://devzone.zend.com/article / 761

Расширение Tidy является новым в PHP 5, и доступен с версии PHP 5.0b3 вверх. Он основан на библиотеке TidyLib и позволяет разработчика для проверки, ремонта и анализировать HTML, XHTML и XML документы из PHP.

0
ответ дан 30 November 2019 в 09:18
поделиться

XML-документ может иметь только один элемент на корневом уровне. Возможно, у парсера HTML есть подобное требование. Попробуйте заключить содержимое в тег .

Кажется, это что-то еще. На этой странице описывается, что может быть причиной. Я бы рекомендовал вам использовать XPath для получения элемента.

0
ответ дан 30 November 2019 в 09:18
поделиться

Фрагмент - это HTML, но для анализа через DOM он должен XHTML. Каждый открытый тег должен быть закрыт.

В вашем случае это означает, что вы должны заменить
на
и с

-1
ответ дан 30 November 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: