DOMDocument的[documentElement]具有错误内容,而[textContent]包含页面的所有文本

时间:2017-10-22 13:09:25

标签: php html dom xpath web-scraping

我尝试从HTML页面中选择内容。问题是DOMDocument($html)在' [documentElement]'中没有元素的结果。节点。但是,HTML页面的所有文本(不包括HTML标记)都在[textContent]内。 这就是我创建DOMDocument对象的方式:

$doc = new DOMDocument();
libxml_use_internal_errors(true);
$html = file_get_contents("https://example.com");
$doc->loadHTML($html);

这是输出的对象:

DOMDocument Object (
[doctype]=> (object value omitted)
[implementation]=> (object value omitted)
[documentElement]=> (object value omitted)
[actualEncoding]=> utf-8
[encoding]=> utf-8
[xmlEncoding]=> utf-8
[standalone]=> 1
[xmlStandalone]=> 1
[version]=>
[xmlVersion]=>
[strictErrorChecking]=> 1
[documentURI]=>
[config]=>
[formatOutput]=>
[validateOnParse]=>
[resolveExternals]=>
[preserveWhiteSpace]=> 1
[recover]=>
[substituteEntities]=>
[nodeName]=> #document
[nodeValue]=>
[nodeType]=> 13
[parentNode]=>
[childNodes]=> (object value omitted)
[firstChild]=> (object value omitted)
[lastChild]=> (object value omitted)
[previousSibling]=>
[nextSibling]=>
[attributes]=>
[ownerDocument]=>
[namespaceURI]=>
[prefix]=>
[localName]=>
[baseURI]=>
[textContent]=> blah blah blah

这样我就无法浏览HTML标签并选择特定内容。偶数new DOMXpath($doc)没有返回有用的内容,我认为这是因为DOMXpath($doc)取决于[documentElement]对象的DOMDocument节点。这是var_dump(new DOMXpath($doc));

的输出

object(DOMXPath)#2 (1) { ["document"]=> string(22) "(object value omitted)" }

我尝试了两种curlfile_get_contents方法来获取HTML内容,并确信HTML内容是正确的(我能够通过print_r($html)复制PHP文件上的HTML页面另外,我已经在StackOverflow上阅读了几个答案,但无法解决问题。

1 个答案:

答案 0 :(得分:2)

printr和DOMDocument并不是特别有用,信息就在那里,但它显示得不是很好((object value omitted)是提示)。

相反,如果您开始使用DOMDocument方法,saveHTMLsaveXML。他们会为您格式化实际内容...... 如果你试试

$html = file_get_contents("https://example.com");
$doc->loadHTML($html);
echo "print_r()...";
print_r($doc);
echo "saveHTML()...";
echo $doc->saveHTML();

你应该看到差异。

要指出的一点是,要从特定点(例如从XPath结果)输出,请使用

echo $doc->saveHTML( $xpResultNode );

编辑:使用更具体的代码:

$doc = new DOMDocument();
$html = file_get_contents("https://example.com");
$doc->loadHTML($html);
$xp = new DOMXpath($doc);
$node = $xp->query('//*[@id="datacontainer"]/div[2]/table/tbody/tr[3]/td[4]/table/tr[2]/td');
echo $doc->saveHTML($node[0]);

我稍微修改了XPath查询,因为在最后一级表中没有tbody标记。