gpt4 book ai didi

php - 使用 PHP DomDocument 抓取格式错误的 HTML

转载 作者:行者123 更新时间:2023-12-04 16:49:02 25 4
gpt4 key购买 nike

我正在使用 PHP DomDocument + XPath 来抓取各种网页。我发现在某些情况下,DomDocument 甚至无法加载 HTML,只会返回一个空结果。例如,页面包含两个正文标签或有错误的 DOCTYPE 声明。我尝试使用 PHP Tidy 预处理格式错误的 HTML,它确实有帮助,但 PHP Tidy 非常慢!

我不想使用任何第三方库,例如 Simple Html Dom Parser

请告知如何使用 PHP DomDocument 处理格式错误的 HTML。在发送到 DomDocument 之前,我应该编写自定义正则表达式来修复损坏的 HTML 吗?也许我错过了 PHP DomDocument 的一些设置?

UPD

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://example.com');
$result = curl_exec($ch);
curl_close($ch);

$dom = new DomDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($result);
libxml_clear_errors();
var_dump($dom);

$xpath = new DomXPath($dom);
$nodes = $xpath->query(".//*[@id='content']/ul/li/div[2]/h3/a");

var_dump($nodes); // Nothing

var_dump($dom) 的结果;
object(DOMDocument)#25 (34) {
["doctype"]=>
string(22) "(object value omitted)"
["implementation"]=>
string(22) "(object value omitted)"
["documentElement"]=>
NULL
["actualEncoding"]=>
string(5) "UTF-8"
["encoding"]=>
string(5) "UTF-8"
["xmlEncoding"]=>
string(5) "UTF-8"
["standalone"]=>
bool(true)
["xmlStandalone"]=>
bool(true)
["version"]=>
NULL
["xmlVersion"]=>
NULL
["strictErrorChecking"]=>
bool(true)
["documentURI"]=>
NULL
["config"]=>
NULL
["formatOutput"]=>
bool(false)
["validateOnParse"]=>
bool(false)
["resolveExternals"]=>
bool(false)
["preserveWhiteSpace"]=>
bool(true)
["recover"]=>
bool(false)
["substituteEntities"]=>
bool(false)
["nodeName"]=>
string(9) "#document"
["nodeValue"]=>
NULL
["nodeType"]=>
int(13)
["parentNode"]=>
NULL
["childNodes"]=>
string(22) "(object value omitted)"
["firstChild"]=>
string(22) "(object value omitted)"
["lastChild"]=>
string(22) "(object value omitted)"
["previousSibling"]=>
NULL
["attributes"]=>
NULL
["ownerDocument"]=>
NULL
["namespaceURI"]=>
NULL
["prefix"]=>
string(0) ""
["localName"]=>
NULL
["baseURI"]=>
NULL
["textContent"]=>
string(0) ""
}

UPD2。重复 <body> DomDocument 是可以的。 html 中有前导空格,通过添加 trim() 解决 $dom->loadHTML(trim($result));

最佳答案

DOMDocumentloadHTML()方法可以很好地处理格式错误的 HTML,但是它会产生很多错误。您将希望抑制这些错误冒泡到您的默认错误处理程序中,如下所示:

<?php
// some process of fetching the HTML page
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($scrappedPage);

如果您在将文件传递给 DOMDocument 之前没有这样做,那么使用 CURL 来抓取要废弃的文件可能是值得的。确保您在处理非常糟糕的 HTML 时不会遇到超时问题。这也将使您能够在本地捕获文件并检查遇到的错误。这也意味着您将有一个格式错误的 HTML 示例来显示您的下一个问题。

从 PHP 5.4.0 和 Libxml 2.6.0 开始,您还可以使用可选的 options 参数来提供额外的 Libxml 参数。其中一些可能有用:
  • LIBXML_HTML_NODEFDTD :防止在找不到默认文档类型时添加默认文档类型
  • LIBXML_PARSEHUGE :放宽解析器的任何硬编码限制。这会影响诸如文档最大深度或实体递归等限制,以及文本节点大小的限制。
  • 阅读更多:http://php.net/manual/en/libxml.constants.php
  • 关于php - 使用 PHP DomDocument 抓取格式错误的 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29987361/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com