【问题标题】:HTML parsing for a certain part of divdiv的某个部分的HTML解析
【发布时间】:2013-11-12 19:11:25
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

  • 并非每个 HTML 元素都称为div。这是span

标签: php html html-parsing data-scrubbing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    不要使用正则表达式来解析 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 解析器比浏览器解析器限制更多,并且会在从互联网提取的某些页面上“打嗝”。

    【讨论】:

    • 这个,还有很多其他的!请参阅 SO Question HTML Pharsers in PHP,如果您知道结构,XPath 将能够在几乎一行代码中获取您的值。
    • 我建议使用 DOMXpath::evaluate() 而不是 DOMXpath::query()。 Evaluate 可以返回标量,而不仅仅是节点列表。这允许使用单行 XPath 将值作为字符串获取:“string(//span[@itemprop='average']/@content)”
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 2010-12-28
      • 2012-09-16
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多