【问题标题】:PHP XPath : How to grab content AND html tags of a div?PHP XPath:如何获取 div 的内容和 html 标签?
【发布时间】:2015-07-20 14:00:38
【问题描述】:

我正在尝试抓取网页,我想抓取 div 标记内的文本和所有 HTML 标记。

网页如下所示:

<div class="class">
  <p>A little paragraph</p>
  <a href="#"><img src="/test.jpg"/></a>
  <p>Another paragraph</p>
  <ul>
    <li>1</li>
    <li>2</li>
  </ul>
</div>

使用 cURL 我已成功提取所有文本,但标签不存在。

我的代码:

$content = $xpath->query('//div[@class="class"]');

【问题讨论】:

  • 您要提取哪个文本?

标签: php html curl xpath web-scraping


【解决方案1】:

这很简单:

<?php

$html = '
<div class="class">
  <p>A little paragraph</p>
  <a href="#"><img src="/test.jpg"/></a>
  <p>Another paragraph</p>
  <ul>
    <li>1</li>
    <li>2</li>
  </ul>
</div>';

$dom = new DomDocument();
@$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$masterNode = $xpath->query('//div[@class="class"]'); #It returns DOMNodeList

# Now from master node we gonna pick what we want.
# Also, $masterNode->item(0) is context node for "P" tags.
$paragraphNodes = $xpath->query('p', $masterNode->item(0)); 

foreach ($paragraphNodes as $paragraphElement) {
    print $paragraphElement->nodeValue . "\n";
}

以上代码返回:

 A little paragraph
 Another paragraph

这是一个可运行的示例:http://3v4l.org/9CYCs

从 div 中获取所有子节点

<?php
// ...
$dom = new DomDocument();
@$dom->loadHTML($html);
$xpath = new DOMXpath($dom);

这里是来自 div.class 的所有子节点(它返回一个 DOMNodeList 实例):

$allChildNodesFromDiv = $xpath->query('//div[@class="class"]/*');
# Do somenthing with child nodes (see DOMElement)
foreach($allChildNodesFromDiv as $nodeElement) {
    # Do something with $nodeElement, for instance:
    print $nodeElement->nodeName;       
    print $nodeElement->nodeValue;  
   // ...   
}

注意DOMNodeList 是一组DOMElement 对象。

相关文档链接:

【讨论】:

  • 感谢您的回答@felipsmartin。但是您的解决方案返回的结果与我的相同:/ 我无法在
    标记之间查看所有 HTML 标记。
  • 你想拿什么,具体来说?
  • 你好 felipsmartins。所以,如果我想获取整个 div 类名是“class”。我必须使用以下条件进行循环:
  • @Alex,是的!因为来自 DIV 的子节点是一组 dom 节点(DOMElement)对象,所以必须对其进行迭代。
  • 你好@felipsmartins 所以,如果我想获取类名是“class”的整个div。我必须再做一次 foreach 吗?比如: query('//div[@class="class"]/'.$ne.'); #这里我可以返回或加入数据是成功的好方法吗?亲切的问候
【解决方案2】:

对于爬行,我建议使用 php_query,下面是链接。它为页面提供类似 jquery 的选择器。 HTML 页面不一定是正确的 xml,除非它们是 XHTML。

https://code.google.com/p/phpquery/

【讨论】:

  • 最新版本是 2009 年 5 月 1 日。给出这个答案时已经 6 岁了。我强烈建议不要使用它。直到大约 5 年前它出现故障时,我才使用它
【解决方案3】:

正确答案是:

        $nodes = $xpath->query("//div[contains(concat(' ', normalize-space(@class), ' '), ' class')]");
        foreach($nodes as $full_name) {
            $class_full_content = trim($dom->saveHTML($full_name));
        }

【讨论】:

    【解决方案4】:

    使用 PHP 轻松完成。

    $all_data = file_get_contents("link of the url");
    

    现在使用:PHP 正则表达式、explode、implode 等来实现你想要的 数据。

    【讨论】:

    • 或许你应该看看this。
    • 大声笑:你可以轻松做到。但是你必须使用: htmlentities($str) 之后使用正则表达式和所有过滤器。最后使用 html_entity_decode 。我想你会得到降神会。
    • 感谢您的回答@AdamSmith 那么最简单的解决方案是使用 RegEx 爆炸网页?我正在使用 curl 和 Xpath,就像 felipsmartins 说的那样
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签