DOMDocument w php
Właśnie zacząłem czytać dokumentację i przykłady dotyczące DOM, aby indeksować i analizować dokument.
Na przykład mam część dokumentu pokazaną poniżej:
<div id="showContent">
<table>
<tr>
<td>
Crap
</td>
</tr>
<tr>
<td width="172" valign="top"><a href="link"><img height="91" border="0" width="172" class="" src="img"></a></td>
<td width="10"> </td>
<td valign="top"><table cellspacing="0" cellpadding="0" border="0">
<tbody><tr>
<td height="30"><a class="px11" href="link">title</a><a><br>
<span class="px10"></span>
</a></td>
</tr>
<tr>
<td><img height="1" width="580" src="crap"></td>
</tr>
<tr>
<td align="right">
<a href="link"><img height="16" border="0" width="65" src="/buy"></a>
</td>
</tr>
<tr>
<td valign="top" class="px10">
<p style="width: 500px;">description.</p>
</td>
</tr>
</tbody></table></td>
</tr>
<tr>
<td>
Crap
</td>
</tr>
<tr>
<td>
Crap
</td>
</tr>
</table>
</div>
Próbuję użyć poniższego kodu, aby pobrać wszystkie znaczniki tr
i przeanalizować, czy w nich są bzdury lub informacje:
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$tags = $xpath->query('.//div[@id="showContent"]');
foreach ($tags as $tag) {
$string="";
$string=trim($tag->nodeValue);
if(strlen($string)>3) {
echo $string;
echo '<br>';
}
}
Jednak dostaję tylko stripped string bez tagów, na przykład:
Crap
Crap
Title
Description
Ale chciałbym dostać:
<tr>
<td>Crap</td>
</tr>
<tr>
<a href="link">title</a>
</tr>
Jak zachować węzły html (tagi)?
2 answers
Jeśli chcesz pracować z DOM, musisz zrozumieć tę koncepcję. Wszystko w dokumencie DOM, łącznie z dokumentem DOMDocument, jest węzłem.
DOMDocument jest hierarchiczną strukturą drzewa węzłów. Zaczyna się od węzła głównego. Ten węzeł główny może mieć węzły potomne, a wszystkie te węzły potomne mogą mieć węzły potomne same. Zasadniczo wszystko w DOMDocument
jest rodzajem węzła, czy to elementy, atrybuty czy treść tekstowa.
HTML Legend:
/ \ UPPERCASE = DOMElement
HEAD BODY lowercase = DOMAttr
/ \ "Quoted" = DOMText
TITLE DIV - class - "header"
| \
"The Title" H1
|
"Welcome to Nodeville"
Powyższy diagram pokazuje DOMDocument z kilkoma węzłami. Istnieje element root (HTML) z dwójką dzieci (głowa i ciało). Linie łączące nazywane są osiami. Jeśli podążasz wzdłuż osi do elementu TITLE, zobaczysz, że ma on jeden liść tekstu Dom. Jest to ważne, ponieważ ilustruje często pomijaną rzecz:
<title>The Title</title>
Nie jest jednym, ale dwoma węzłami. DOMElement z dzieckiem DOMText. Podobnie, to
<div class="header">
To tak naprawdę trzy węzły: DOMElement z DOMAttr trzymającym DOMText. Ponieważ wszystkie te dziedziczą swoje właściwości i metody z DOMNode, niezbędne jest zapoznanie się z klasą DOMNode.
W praktyce oznacza to, że pobrany DIV jest połączony ze wszystkimi innymi węzłami w dokumencie. Możesz przejść całą drogę do elementu korzeniowego lub w dół do liści w dowolnym momencie. Wszystko tu jest. Wystarczy zapytać lub przejść do dokumentu w celu uzyskania żądanych informacji.
Czy zrobisz to poprzez iterację childNodes
z DIV
lub użyj getElementByTagName()
lub XPath zależy od Ciebie. Ty musisz tylko zrozumieć, że nie pracujesz z surowym HTML, ale z węzłami reprezentującymi cały dokument HTML.
Jeśli potrzebujesz pomocy w wyodrębnieniu konkretnych informacji z dokumentu, musisz wyjaśnić, jakie informacje chcesz z niego pobrać. Na przykład, można zapytać, jak pobrać wszystkie linki z tabeli, a następnie możemy odpowiedzieć coś w stylu:
$div = $dom->getElementById('showContent');
foreach ($div->getElementsByTagName('a') as $link)
{
echo $dom->saveXML($link);
}
Ale jeśli nie jesteś bardziej konkretny, możemy tylko zgadnąć, które węzły mogą być istotne.
Jeśli Potrzebujesz więcej przykładów i fragmentów kodu, jak pracować z DOM przejrzyj moje poprzednie odpowiedzi na powiązane pytania:
Do tej pory powinien być fragment dla każdej podstawowej i średniej bazy, którą możesz mieć z DOM.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:01
Aby utworzyć parser możesz użyć htmlDOM .
Jest to bardzo prosty, łatwy w użyciu parser DOM napisany w php. Za jego pomocą można łatwo pobrać zawartość znacznika div
.
Na przykład Znajdź wszystkie znaczniki div
, które mają atrybut {[3] } o wartości text
.
$ret = $html->find('div[id=text]');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-01 14:53:41