2012-03-27 97 views
1

我正在使用爬虫来检索Web上某些页面的HTML内容。我现在有存储在一个单一的PHP变量整个HTML:如何仅使用PHP从HTML文档中提取某些标记?

$string = "<PRE>".htmlspecialchars($crawler->results)."</PRE>\n"; 

我想要做的是选择所有“P”的标签(例如)以及它们存储在数组中。什么是正确的方法来做到这一点?

我试过以下,通过使用xpath,但它不显示任何东西(最有可能因为文档本身不是一个XML,我只是复制粘贴其文档中给出的示例)。在PHP

$xml = new SimpleXMLElement ($string); 

    $result=$xml->xpath('/p'); 
    while(list(, $node)=each($result)){ 
     echo '/p: ' , $node, "\n"; 
    } 

希望有人用(很多)更多的经验将能够帮助我:d

+1

这可能会帮助你:http://simplehtmldom.sourceforge.net/ – 2012-03-27 20:18:39

+0

非常感谢!这看起来像一个非常坚实和优雅的解决方案。将马上看到它! – Eugen 2012-03-27 20:24:19

+0

没问题。虽然不完美,但似乎大部分时间都适用。 – 2012-03-27 20:41:37

回答

1

检出Simple HTML Dom。它将抓取外部页面并以相当准确的细节处理它们。

http://simplehtmldom.sourceforge.net/

它可以像这样使用:

// Create DOM from URL or file 
$html = file_get_html('http://www.google.com/'); 

// Find all images 
foreach($html->find('img') as $element) 
    echo $element->src . '<br>'; 
2

我投票支持使用正则表达式。对于标签p

preg_match_all('/<p>(.*)<\/p>/', '<p>foo</p><p>foo 1</p><p>foo 2</p>', $arr, PREG_PATTERN_ORDER); 
if(is_array($arr)) 
{ 
foreach($arr as $value) 
{ 
    echo $value."</br>"; 
} 
} 
+0

我写的是一样的,我想补充一点,使用XML阅读器阅读HTML文档是不安全的。没有一半的网页上的HTML格式正确地形成XML ... – haltabush 2012-03-27 20:22:56

+0

Yeap ...当我们说话时,我发现了这一点。感谢您的时间...我会在一秒内尝试您的解决方案并回复您.. – Eugen 2012-03-27 20:29:48

+1

如果您关注格式良好的HTML,请查看DOMDocument上的文档。它的loadHTML方法并不要求HTML格式完美,它提供了很多便利。 – clexmond 2012-03-27 20:34:40

3

尝试使用DOMDocumentDOMDocument::getElementsByTagName一起。工作流程应该非常简单。例如:

$doc = DOMDocument::loadHTML(htmlspecialchars($crawler->results)); 
$pNodes = $doc->getElementsByTagName('p'); 

哪个会返回一个DOMNodeList。

相关问题