功夫码

在PHP下用XPath获取HTML节点和出现乱码的解决方法

晓峰 时间:2019-04-26 11:02:39 阅读:231

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。这里讨论的是在XPath语言规范下,封装而成的一种解析XML文档的技术。在PHP,Python里,具体是指xpath这个函数。所以,Wikipedia提到的对XML文档某部分位置的定位,就是用XPath的规范,定位到这个部分,为我所用。我们的目的是解析HTML网页中的元素,将HTML转换成XML文档之后,就是XPath出鞘之时。具体的转换方法,因开发环境而异,后文会附上一些实际工作中遇到的问题。下文所述的xpath()函数均指PHP语言核心函数库中的函数xpath()。相比于正则表达式,这个方法更简单快捷。


PHP DOM XPath获取HTML节点出现乱码的解决方

我测试过的好用的第一个方法

$doc = new DOMDocument(); 
$doc->loadHTML('<?xml encoding="UTF-8">' . $html); 
// dirty fix 
foreach ($doc->childNodes as $item){
    if ($item->nodeType == XML_PI_NODE){
        $doc->removeChild($item); // remove hack 
    }         
}     
$doc->encoding = 'UTF-8'; // insert proper 


第二个方法解决乱码的方法:

$pageDom = new DomDocument();    
$searchPage = mb_convert_encoding($htmlUTF8Page, 'HTML-ENTITIES', "UTF-8"); 
@$pageDom->loadHTML($searchPage); 


这样就可以解决出现乱码问题了



xpath 和 dom 用法实例

$html = <<<HTML    <div class="container">
        <img class="logo img" id="img1" src="/images/img1.jpg" />
        <img class="icon img" id="img2" src="/images/img2.jpg" />
        <img class="icon use" id="img3" src="/images/img3.jpg" />
        <p class="icon" id="content">Welcome PHP!</p>
    </div>
HTML;

我们把它赋值给字符串变量$html。
我们将$html加载到DOM对象,再用DOMXPath解析处理。

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);

1 DOMXPath用法
接下来我们将用DOMXPath的方法来解析。
DOMXPath有两个核心的部分:传入的表达式和返回值。

2 获取img src
获取第一个图片的src内容:

echo $src = $xpath->evaluate('string(//img/@src)');
/*输出: /images/img1.jpg

获取全部IMG SRC内容
$nodeList = $xpath->query("//img"); 
$srcList = [];
foreach ($nodeList as $node) {     
    $srcList[] = $node->attributes->getNamedItem('src')->nodeValue; 
} 
print_r($srcList);
/*输出: 
Array (  
[0] => /images/img1.jpg  
[1] => /images/img2.jpg  
[2] => /images/img3.jpg ) 
*/


3 获取特定class DOM
获取所有class等于content的id值,这里class值必须是唯一的:

$nodeList = $xpath->query('//*[@class="icon"]'); 
$result = [];
foreach ($nodeList as $node) {     
    $result[] = $node->attributes->getNamedItem('id')->nodeValue; 
} 
print_r($result);
/*输出: Array (     [0] => content ) */


获取所有class包含icon的节点的id值:
$nodeList = $xpath->query('//*[contains(@class, "icon")]');
$result = [];foreach ($nodeList as $node) {
    $result[] = $node->attributes->getNamedItem('id')->nodeValue;
}
print_r($result);/*输出:
Array
(
    [0] => img2
    [1] => img3
    [2] => content
)

*/
获取所有class包含icon的节点的完整HTML内容:
$nodeList = $xpath->query('//*[contains(@class, "icon")]');
$result = [];
foreach ($nodeList as $node) {    
    $result[] = $dom->saveHTML($node);
}
print_r($result);
/*输出:
Array
(
    [0] => <img class="icon img" id="img2" src="/images/img2.jpg">
    [1] => <img class="icon use" id="img3" src="/images/img3.jpg">
    [2] => <p class="icon" id="content">Welcome PHP!</p>
)
*/

常用到的:
$element->nodeValue
$element->getElementsByTagName('td')->item(1)->nodeValue
$element->getElementsByTagName('td')->item(5)->getElementsByTagName('a')->item(0)->getAttribute('href')

。


本文来源:功夫码(gongfuma.com)

声明:本文系功夫码原创稿件,版权属[功夫码 gongfuma.com]所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:功夫码",违者将依法追究责任。

相关文章

回到顶部