DomDocument, parsowanie html'a

0

Witam,
załóżmy, że mam htmla w takiej postaci:

<html>
<head>
.
.
.
</head>
<body>
<div>Treść 1</div>
<div>Treść 2
<p>Treść 3</p>
<a href="#">Link 1</a>
</div>
<span>Testowy span</span>
</body>
</html>

Chciałbym, DomDocumentem albo jakoś inaczej sparsować ten kkod html aby:

  • uzyskać czysty tekst body
  • bez linków

Przykładowo dla zastosowanego przykładu skrypt zwracałby:

Treść 1
Treść 2
Treśc 3
Testowy span

czyli link z anchorem poleciał natomiast pozostały plaintext został. Nie wiem do końca jak parsować każdy jeden z elementów dokumentu.

Dzięki

0

Rekurencyjnie przejść po dokumencie za pomocą xslt kopiując tagi?

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="//body//*[not(self::a)]">
  <xsl:copy>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Bardzo z głowy napisane...

0

Tylko jak zrealizować tą rekurencyjność?
Bo jak bym to wiedział to bym po prostu sprawdzał czy ten element to link i usuwał go z dokumentu. A jak nie link to bym go zostawiał, tzn jego wartość czyli sam tekst.

0

To akurat zapewnia apply-templates, które będzie łaziło po drzewie xml tak długo, aż nie wyczerpie wszystkich możliwości.

0

Html to nie xhtml. Jesteś pewien, że zawsze będziesz mieć do czynienia z tym drugim?

0

Po nakierowaniu przez Koziołka znalazłem takie rozwiązanie:

	function treatNode($node)
	{
		if ($node->childNodes) {
			foreach ($node->childNodes as $child){
				treatNode($child);
			}
		} else {
			echo $node->parentNode->nodeName . " - " . $node->nodeName . " - " . $node->nodeValue . "
			";
		}
	}	

		$dom1 = new DOMDocument();
		@$dom1->loadHTML($con1);
		
		$i = 0;
		while (is_object($expr = $dom1->getElementsByTagName("body")->item($i))) {
			treatNode($expr);
			$i++;
		}	

Dzięki.

0

Polecam biblotekę:
https://code.google.com/p/phpquery/

Takie jQuery w PHP ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1