<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>sorgalla.com &#187; CSS</title>
	<atom:link href="http://sorgalla.com/tag/css/feed/" rel="self" type="application/rss+xml" />
	<link>http://sorgalla.com</link>
	<description>PHP, Zend Framework, Datenbanken und was sonst noch so anfällt.</description>
	<lastBuildDate>Tue, 05 Jul 2011 07:20:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Daten aus HTML-Dokumenten extrahieren mit Zend_Dom_Query</title>
		<link>http://sorgalla.com/2010/01/07/daten-aus-html-dokumenten-extrahieren-mit-zend_dom_query/</link>
		<comments>http://sorgalla.com/2010/01/07/daten-aus-html-dokumenten-extrahieren-mit-zend_dom_query/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 18:50:24 +0000</pubDate>
		<dc:creator>jan</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XPath]]></category>
		<category><![CDATA[Zend_Dom_Query]]></category>

		<guid isPermaLink="false">http://sorgalla.com/?p=376</guid>
		<description><![CDATA[Steht man vor dem Problem Daten aus HTML-Dokumenten zu extrahieren, kommen einem oft als erstes reguläre Ausdrücke in den Sinn. Kore Nordmann hat jedoch bewiesen, dass es nicht möglich ist, HTML mit regulären Ausdrücken zu parsen und empfiehlt stattdessen die DOM-Extension zu nutzen. Genau diese nutzt die Zend_Dom_Query-Komponente und bietet eine einfache Möglichkeit, auf ein [...]]]></description>
			<content:encoded><![CDATA[<p>Steht man vor dem Problem Daten aus HTML-Dokumenten zu extrahieren, kommen einem oft als erstes reguläre Ausdrücke in den Sinn. Kore Nordmann hat jedoch bewiesen, dass es <a href="http://kore-nordmann.de/blog/0081_parse_html_extract_data_from_html.html">nicht möglich ist, HTML mit regulären Ausdrücken</a> zu parsen und empfiehlt stattdessen die <a href="http://php.net/manual/en/book.dom.php">DOM-Extension</a> zu nutzen.<br />
<span id="more-376"></span></p>
<p>Genau diese nutzt die <a href="http://framework.zend.com/manual/de/zend.dom.query.html">Zend_Dom_Query</a>-Komponente und bietet eine einfache Möglichkeit, auf ein (X)HTML-Dokument zuzugreifen. Neben dem Zugriff über XPath bietet die Komponente aber auch die Möglichkeit über CSS-Selektoren bestimmte Knoten aus einem Dokument zu selektieren (wie man es von <a href="http://prototypejs.org/api/utility/dollar-dollar">vielen</a> <a href="http://docs.jquery.com/Selectors">Javascript</a>-<a href="http://api.dojotoolkit.org/jsdoc/dojo/HEAD/dojo.query">Frameworks</a> her kennt).</p>
<p>Der Konstruktor erwartet einen (X)HTML- oder XML-String. Abfragen mit CSS-Selektoren werden über die <code>query</code>-Methode gemacht welche dann ein <code>Zend_Dom_Query_Result</code>-Objekt zurückliefert.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$dom</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Dom_Query<span style="color: #009900;">&#40;</span><span style="color: #000088;">$html</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'selector'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Zend_Dom_Query_Result implements the Countable and Iterator interface</span>
<span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$node</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// $node instanceof DOMElement</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<table class="summary">
<caption>Folgende Elemente können bei CSS-Selektoren verwendet werden</caption>
<tbody>
<tr>
<th>#id</th>
<td>
<p>Findet das Element mit dem angegebenen id-Attribut. Zum Beispiel alle Elemente mit der id &#8220;foo&#8221; (z. B. <code>&lt;div id="foo"&gt;&lt;/div&gt;</code>):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'#foo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

</td>
</tr>
<tr>
<th>element</th>
<td>
<p>Findet alle Elemente mit dem angegebenen tag-Namen. Zum Beispiel alle <code>div</code>-Elemente:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'div'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

</td>
</tr>
<tr>
<th>.class</th>
<td>
<p>Findet alle Elemente mit der angegebenen Klasse. Zum Beispiel alle Elemente mit der Klasse &#8220;foo&#8221; (z. B. <code>&lt;div class="foo"&gt;&lt;/div&gt;</code>):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'.foo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

</td>
</tr>
<tr>
<th>[attribute]</th>
<td>
<p>Findet alle Elemente mit dem angegebenen Attribut. Dabei werden 3 Arten unterstützt.</p>
<p>1. Findet alle <code>div</code>-Elemente mit dem Attribut &#8220;foo&#8221; und dem Wert &#8220;bar&#8221; (z. B. <code>&lt;div foo="bar"&gt;&lt;/div&gt;</code>):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'div[foo=&quot;bar&quot;]'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>2.  Findet alle <code>div</code>-Elemente mit dem Attribut &#8220;foo&#8221; dessen Wert das Wort &#8220;bar&#8221; enthält (z. B. <code>&lt;div foo="bar baz"&gt;&lt;/div&gt;</code>):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'div[foo~=&quot;bar&quot;]'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>3. Findet alle <code>div</code>-Elemente mit dem Attribut &#8220;foo&#8221; dessen Wert den String &#8220;bar&#8221; irgendwo enthält (z. B. <code>&lt;div foo="barbaz"&gt;&lt;/div&gt;</code>):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'div[foo*=&quot;bar&quot;]'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

</td>
</tr>
</tbody>
</table>
<p>Selektoren können auch &#8220;verkettet&#8221; werden um so Abhängigkeiten definieren.</p>
<p>Das folgende Beispiel findet alle <code>a</code>-Elemente die ein Unterelement eines Elements mit der Klasse &#8220;bar&#8221;<br />
sind, welches wiederum ein Unterelement eines Elements mit der id &#8220;foo&#8221; sein muss<br />
(z. B. <code>&lt;div id="foo"&gt;&lt;div&gt;&lt;div class="bar"&gt;&lt;p&gt;&lt;a href="#"&gt;Link&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</code>):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'#foo .bar a'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Mit einem <code>&gt;</code> können direkte Abhängigkeiten definiert werden.</p>
<p>Das folgende Beispiel findet alle <code>a</code>-Elemente die ein direktes Kindelement des Elements mit der<br />
id &#8220;foo&#8221; sind (z. B. <code>&lt;div id="foo"&gt;&lt;a href="#"&gt;Link&lt;/a&gt;&lt;/div&gt;</code>):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'#foo &gt; a'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Zend_Dom_Query ist übrigens auch fest in <a href="http://framework.zend.com/manual/de/zend.test.phpunit.html#zend.test.phpunit.testing">Zend_Test_PHPUnit_Controller_TestCase</a> integriert und bietet somit <a href="http://framework.zend.com/manual/de/zend.test.phpunit.html#zend.test.phpunit.assertions.query">CSS Selector Assertions</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> FooControllerTest <span style="color: #000000; font-weight: bold;">extends</span> Zend_Test_PHPUnit_Controller_TestCase
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> testIndexContainsLoginForm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dispatch</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assertQuery</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'#login-form'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Links zum Thema</h3>
<ul>
<li><a href="http://kore-nordmann.de/blog/0081_parse_html_extract_data_from_html.html">Extracting data from HTML</a></li>
<li><a href="http://framework.zend.com/manual/de/zend.dom.query.html">Zend_Dom_Query</a></li>
<li><a href="http://framework.zend.com/manual/de/zend.test.phpunit.html#zend.test.phpunit.assertions.query">Zend_Test_PHPUnit_Controller_TestCase</a></li>
</ul>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" class="tt" href="http://twitter.com/intent/tweet?text=Daten+aus+HTML-Dokumenten+extrahieren+mit+Zend_Dom_Query+http%3A%2F%2Fsorgalla.com%2F%3Fp%3D376+%2Fby+%40jansor" title="Post to Twitter"><img class="nothumb" src="http://sorgalla.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://delicious.com/post?url=http://sorgalla.com/2010/01/07/daten-aus-html-dokumenten-extrahieren-mit-zend_dom_query/&amp;title=Daten+aus+HTML-Dokumenten+extrahieren+mit+Zend_Dom_Query" title="Post to Delicious"><img class="nothumb" src="http://sorgalla.com/wp-content/plugins/tweet-this/icons/en/delicious/tt-delicious.png" alt="Post to Delicious" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://sorgalla.com/2010/01/07/daten-aus-html-dokumenten-extrahieren-mit-zend_dom_query/&amp;title=Daten+aus+HTML-Dokumenten+extrahieren+mit+Zend_Dom_Query" title="Post to Digg"><img class="nothumb" src="http://sorgalla.com/wp-content/plugins/tweet-this/icons/en/digg/tt-digg.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://sorgalla.com/2010/01/07/daten-aus-html-dokumenten-extrahieren-mit-zend_dom_query/&amp;t=Daten+aus+HTML-Dokumenten+extrahieren+mit+Zend_Dom_Query" title="Post to Facebook"><img class="nothumb" src="http://sorgalla.com/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://sorgalla.com/2010/01/07/daten-aus-html-dokumenten-extrahieren-mit-zend_dom_query/&amp;title=Daten+aus+HTML-Dokumenten+extrahieren+mit+Zend_Dom_Query" title="Post to Reddit"><img class="nothumb" src="http://sorgalla.com/wp-content/plugins/tweet-this/icons/en/reddit/tt-reddit.png" alt="Post to Reddit" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://sorgalla.com/2010/01/07/daten-aus-html-dokumenten-extrahieren-mit-zend_dom_query/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

