2012-12-05 94 views
9

我目前正试图解析来自论坛的一些数据。下面是代码:与PHP一起使用Xpath解析HTML

$xml = simplexml_load_file('https://forums.eveonline.com'); 

$names = $xml->xpath("html/body/div/div/form/div/div/div/div/div[*]/div/div/table//tr/td[@class='topicViews']"); 
foreach($names as $name) 
{ 
    echo $name . "<br/>"; 
} 

无论如何,问题是,我使用的是谷歌的XPath扩展帮我弄的路径,我猜测,谷歌正在改变HTML足以使它不上来当我用我的网站做这个搜索。是否有某种方式可以让主持人通过谷歌浏览器查看网站,以便获得正确的代码?你会建议什么?

谢谢!

+1

您是否尝试在Web浏览器中禁用Javascript?您的PHP不会使用它,因此在网站上由javascript完成的任何更改都不会在服务器上。 –

+0

XPath适用于XML,不适用于HTML。 – GolezTrol

+1

JS正在运行在我正在运行的页面上。我知道XPath是用于XML的,但从我通过Google搜索看到的,它也很流行用于HTML。 – VixenSoul

回答

3

双'/'将进行xpath搜索。所以如果你使用xpath'// table',你会得到所有的表。 你也可以在xpath结构中使用这个更深的,如'html/body/div/div/form // table'来获得xpath'html/body/div/div/form'下的所有表格。

通过这种方式,您可以使您的代码更适应HTML源代码的变化。

如果你想使用它,我建议学习一些关于xpath的知识。复制粘贴只会让你到目前为止。

有关语法一个简单的解释可以在http://www.w3schools.com/xpath/xpath_syntax.asp

36

找到我的建议是始终使用DOMDocument,而不是SimpleXML的,因为它是一个更漂亮的界面一起工作,使任务很多更加直观。

以下示例说明如何将HTML加载到DOMDocument对象中,并使用XPath查询DOM。你真正需要做的是找到所有TD元素与topicViews类的名称,这将输出每个的nodeValue成员在的DOMNodeList此XPath查询返回找到。

/* Use internal libxml errors -- turn on in production, off for debugging */ 
libxml_use_internal_errors(true); 
/* Createa a new DomDocument object */ 
$dom = new DomDocument; 
/* Load the HTML */ 
$dom->loadHTMLFile("https://forums.eveonline.com"); 
/* Create a new XPath object */ 
$xpath = new DomXPath($dom); 
/* Query all <td> nodes containing specified class name */ 
$nodes = $xpath->query("//td[@class='topicViews']"); 
/* Set HTTP response header to plain text for debugging output */ 
header("Content-type: text/plain"); 
/* Traverse the DOMNodeList object to output each DomNode's nodeValue */ 
foreach ($nodes as $i => $node) { 
    echo "Node($i): ", $node->nodeValue, "\n"; 
}