2011-11-20 289 views
0

我想写一个机器人,每天将获取html解析它。 现在为解析HTML我可以使用只是字符串函数,如爆炸或校正表达式,但我发现DOM XPath代码更干净,所以现在我可以配置所有的网站,我必须去掉蜘蛛和标签,我必须去掉像:Dom和xpath查询为html解析

'http://examplesite.com' => '//div/a[@class="articleDesc"]/@href' 

因此,代码看起来像这样

@$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
$tags = $xpath->query('//body/div[@class="articleDesc"]'); 


foreach ($tags as $tag) 
    echo $tag->nodeValue . "\n"; 

所以我得到的所有div标签与类文章的描述,这是我很大的。但我注意到div标签内的所有html标签都被剥离了。 我想知道如何获得我正在查看的div的全部内容。

我也很难看到$ xpath-> query()的任何适当的文档来查看如何形成字符串。这个php网站并没有讲述它的确切形式。尽管如此,我的主要问题我

+1

查看http://stackoverflow.com/questions/2087103/innerhtml-in-phps-domdocument –

+0

及其对应物http://stackoverflow.com/questions/5404941/php-domdocument-outerhtml-for-element/5404962 #5404962 – Gordon

+1

XPath 1.0规格:http://www.w3.org/TR/xpath/ – Gordon

回答

2

简单的答案是:

foreach ($tags as $tag) 
    echo $dom->saveXML($tag); 

如果你想HTML剥开一个标签时,XPath的是

//a[@class="articleDesc"] 

这是假设的一个标签有class属性

+0

非常感谢! –

1

尝试使用http://www.php.net/manual/en/simplexmlelement.asxml.php

或者alternative

function getNodeInnerHTML(DOMNode $oNode) { 
    $oDom = new DOMDocument(); 
    foreach($oNode->childNode as $oChild) { 
    $oDom->appendChild($oDom->importNode($oChild, true)); 
    } 
    return $oDom->saveHTML(); 
} 
+0

meh ..这会工作的方式,但对于我来说,完美的方式是从'http://examplesite.com'=>'// div/a [@ class =“articleDesc”]/@ href'获取匹配元素的html未剥离字符串列表。 。我想知道我该怎么做 –

+0

我可能在这里弄错了,但是这并不只是要求你使用上面的函数之一来获取与你的XPath匹配的父元素的innerHTML? –

+0

我认为不是....匹配xpath的父元素的内部html会返回其中的所有html。然而,我想要得到所有类标题为desc的div标签,例如... –

0

这应该加载所有的内标签的为好。虽然它不是DOM,但它们是可以互换的。稍后,您可以将其重新转换回DOM。

$xml=simplexml_load_string($html); 
$tags=$xml->xpath('//body/div[@class="articleDesc"]'); 
+0

发出错误。 expath不支持$ xml。如果我在第二行之前尝试$ xml = dom_import_simplexml($ xml),它也不起作用 –

+0

准确的错误将会有帮助。第一行将'$ html'字符串导入到simplexml中,如果它不是字符串,请尝试'simplexml_load_file'。第二行直接从你的复制,但转换为simplexml。诚然,我没有自己运行它,但这是我在工作中使用的相同的代码,并且它适用于我。 ''dom_import_simplexml($ tags)''应该只在simplexml被加载后使用,并且假设你在DOM中有一些你想要做的事情,否则它不是必需的,只是包含在你想要在加载后切换回DOM的情况下结果。 – mseancole

+0

simplexml_load_string($ html)返回false,当我把它放入xpath()后,当然会打破... 它也给出了很多警告,如: Warning:simplexml_load_string()[function.simplexml-load-string]:实体:第36行:解析器错误:打开和结束标记不匹配:META第8行和HEAD在/usr/share/nginx/html/synd/robots/robot.php上线25 我知道html可能不完美可能是simplexml返回false的原因,但它是一个合适的html网页wtich在浏览器中呈现 –

0

你可以使用这个真棒蜘蛛框架(在Python中)Scrapy