1

我正在尝试访问 HTML 页面并从动态生成的 div 中获取某个数字。

<span itemprop="average" content="XX"></span>

我想检索“XX”作为变量,每个页面都会有所不同。

这是通过 HTML 解析还是简单的 preg_replace 完成的?

谢谢

4

3 回答 3

2

如果您刚刚开始进行抓取,我会推荐 Imacros 或 import.io。我在开始抓取任务时就开始使用它们,并且我开始了解它是如何更好地工作的。在抓取时将 cUrl 与 Php 一起使用也非常有帮助,它将是您最好的朋友

于 2013-11-12T19:29:46.587 回答
1

不要使用 REGEX 来解析 HTML。最好的方法是使用解析器。PHP5 附带了一些内容,例如DOMDocumentDOMXPath

这是一个使用两者完成的示例:

$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 解析器比浏览器解析器更严格,并且会在从互联网提取的某些页面上“打嗝”。

于 2013-11-12T19:16:17.430 回答
0

使用 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。有了它,结果是属性值或空字符串。

于 2013-11-12T19:32:29.080 回答