我尝试从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)" }
我尝试了两种curl
和file_get_contents
方法来获取HTML内容,并确信HTML内容是正确的(我能够通过print_r($html)
复制PHP文件上的HTML页面另外,我已经在StackOverflow上阅读了几个答案,但无法解决问题。
答案 0 :(得分:2)
printr
和DOMDocument并不是特别有用,信息就在那里,但它显示得不是很好((object value omitted)
是提示)。
相反,如果您开始使用DOMDocument方法,saveHTML
或saveXML
。他们会为您格式化实际内容......
如果你试试
$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标记。