我正在尝试访问 HTML 页面并从动态生成的 div 中获取某个数字。
<span itemprop="average" content="XX"></span>
我想检索“XX”作为变量,每个页面都会有所不同。
这是通过 HTML 解析还是简单的 preg_replace 完成的?
谢谢
我正在尝试访问 HTML 页面并从动态生成的 div 中获取某个数字。
<span itemprop="average" content="XX"></span>
我想检索“XX”作为变量,每个页面都会有所不同。
这是通过 HTML 解析还是简单的 preg_replace 完成的?
谢谢
如果您刚刚开始进行抓取,我会推荐 Imacros 或 import.io。我在开始抓取任务时就开始使用它们,并且我开始了解它是如何更好地工作的。在抓取时将 cUrl 与 Php 一起使用也非常有帮助,它将是您最好的朋友
不要使用 REGEX 来解析 HTML。最好的方法是使用解析器。PHP5 附带了一些内容,例如DOMDocument和DOMXPath。
这是一个使用两者完成的示例:
$html = '<html><head></head><body>
<span itemprop="average" content="XX">some text</span>
<span itemprop="not_average">other text</span>
</body></html>';
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$nodelist = $xpath->query( "//span[@itemprop='average']" );
foreach ($nodelist as $node){
print $node->getAttribute('content')."<br>";
}
唯一的“问题”是 DOMDocument 解析器比浏览器解析器更严格,并且会在从互联网提取的某些页面上“打嗝”。
使用 DOM 通常是最好的主意。
$html = <<<HTML
<html>
<body>
<span itemprop="average" content="XX"></span>
</body>
</html>
HTML;
libxml_use_internal_errors(TRUE);
$dom = new DOMDocument();
$dom->loadHtml($html);
$xpath = new DOMXpath($dom);
$content = $xpath->evaluate('string(//span[@itemprop = "average"]/@content)');
var_dump($content);
libxml_use_internal_errors() 禁用错误 html 的错误输出。您可以使用 libxml_get_errors() 来读取它们,并使用 libxml_clear_errors() 来清除当前的错误缓冲区。
接下来创建一个 DOMDocument 并加载 html。DOMDocument::loadHtmlFile() 将允许从文件或 url 加载它。
加载文档后,您可以为加载的文档创建一个 DOMXpath 对象,它允许您从中查询元素。
DOMXpath::evaluate() 允许您从文档中查询节点列表和标量。xpath 表达式中的字符串类型转换将属性节点转换为字符串并返回值。如果没有类型转换,结果将是一个包含任意数量的 DOMAttribute 节点的 DOMNodelist。有了它,结果是属性值或空字符串。