質問
私は、DOMはPHPでパースへの新たなんだ:
私は私が解析しようとしているHTMLファイルを持っています。これは、このようなdiv要素の束を持っています:
<div id="interestingbox">
<div id="interestingdetails" class="txtnormal">
<div>Content1</div>
<div>Content2</div>
</div>
</div>
<div id="interestingbox">
......
私は、PHPを使用して多くのDIVボックスの内容を取得しようとしています。 どのように私はこれを行うにはDOMパーサーを使用することができますか?
ありがとうございます。
解決
まず、私はあなたが二つの異なる複数のdivに同じIDを使用することができないことを伝えるために持っています。その点のクラスがあります。すべての要素が一意のIDを持っている必要があります。
コードは、ID = "interestingbox"
とのdivの内容を取得します$html = '
<html>
<head></head>
<body>
<div id="interestingbox">
<div id="interestingdetails" class="txtnormal">
<div>Content1</div>
<div>Content2</div>
</div>
</div>
<div id="interestingbox2"><a href="#">a link</a></div>
</body>
</html>';
$dom_document = new DOMDocument();
$dom_document->loadHTML($html);
//use DOMXpath to navigate the html with the DOM
$dom_xpath = new DOMXpath($dom_document);
// if you want to get the div with id=interestingbox
$elements = $dom_xpath->query("*/div[@id='interestingbox']");
if (!is_null($elements)) {
foreach ($elements as $element) {
echo "\n[". $element->nodeName. "]";
$nodes = $element->childNodes;
foreach ($nodes as $node) {
echo $node->nodeValue. "\n";
}
}
}
//OUTPUT
[div] {
Content1
Content2
}
クラスと例:
$html = '
<html>
<head></head>
<body>
<div class="interestingbox">
<div id="interestingdetails" class="txtnormal">
<div>Content1</div>
<div>Content2</div>
</div>
</div>
<div class="interestingbox"><a href="#">a link</a></div>
</body>
</html>';
//the same as before.. just change the xpath
[...]
$elements = $dom_xpath->query("*/div[@class='interestingbox']");
[...]
//OUTPUT
[div] {
Content1
Content2
}
[div] {
a link
}
詳細については DOMXPathを使うことの最大のページを参照してください。
他のヒント
私はこれが開始と simplehtmldomするを使用して動作するようになった。
$html = file_get_html('example.com');
foreach ($html->find('div[id=interestingbox]') as $result)
{
echo $result->innertext;
}
<のhref = "http://www.sitepoint.com/forums/showthread.php?611393-php5-need-something-like-innerHTML-instead-of-nodeValue" のrel = "nofollowをから非常に素晴らしい機能を「> http://www.sitepoint.com/forums/showthread.php?611393-php5-need-something-like-innerHTML-instead-of-nodeValue の
function innerXML($node)
{
$doc = $node->ownerDocument;
$frag = $doc->createDocumentFragment();
foreach ($node->childNodes as $child)
{
$frag->appendChild($child->cloneNode(TRUE));
}
return $doc->saveXML($frag);
}
$dom = new DOMDocument();
$dom->loadXML('
<html>
<body>
<table>
<tr>
<td id="foo">
The first bit of Data I want
<br />The second bit of Data I want
<br />The third bit of Data I want
</td>
</tr>
</table>
<body>
<html>
');
$xpath = new DOMXPath($dom);
$node = $xpath->evaluate("/html/body//td[@id='foo' ]");
$dataString = innerXML($node->item(0));
$dataArr = explode("<br />", $dataString);
$dataUno = $dataArr[0];
$dataDos = $dataArr[1];
$dataTres = $dataArr[2];
echo "firstdata = $nameUno<br />seconddata = $nameDos<br />thirddata = $nameTres<br />"
WebExtractor: https://github.com/knyga/webextractorする これは、CSS、正規表現、XPathのセレクタでページを解析することができます。
例については、ルックパッケージとテストます:
WebExtractor \ DataExtractor \ DataExtractorFactoryを使用します。つかいます WebExtractor \ DataExtractor \ DataExtractorTypes。つかいます WebExtractor \クライアント\クライアント;
$工場= DataExtractorFactory ::のgetFactory(); $抽出= $出荷時> createDataExtractor(DataExtractorTypes :: CSS)。 $クライアント=新しいです クライアント; $コンテンツ= $クライアント - > GET( ' https://en.wikipedia.org/wiki/2014_Winter_Olympicsする' ); $ extractor->のsetContent($コンテンツ); $ H1 = $ extractor-> setSelector( 'H1') - >エキス();