PHP XPath:如何获取div的内容和html标签?

时间:2015-05-09 19:56:10

标签: php html curl xpath web-scraping

我试图抓取一个网页,我想抓取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"]');

4 个答案:

答案 0 :(得分:0)

这很简单:

<?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个对象。

相关文档链接:

答案 1 :(得分:0)

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

as described by Matthieu Moy

答案 2 :(得分:0)

正确答案是:

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

答案 3 :(得分:-2)

使用PHP轻松完成。

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

现在使用:PHP正则表达式,爆炸,内爆等来实现您的期望 数据