排除部分基于xPath的html

时间:2013-01-22 19:48:09

标签: php html dom xpath

我正在尝试为此page

进行搜索

enter image description here

我正在使用xPath来选择它,我的代码是..

$safeFlag = true ;
//*[@id="tabset_productPage"]/dd[1]/div/div   //HAVE TRIED THIS TOO
//*[@id="tabset_productPage"]/dd[1]/div/div  // HAVE TRIED THIS
$safety_query='//*[@id="tabset_productPage"]/dd[1]/div/div/text()'; 
    $safety = $xpath->query($description_query);



    foreach ($safety as $word1) {

        $safety_warning[]=(trim($word1->nodeValue));
        if($safety_warning != ''){
        $safeFlag = false ;
        $safety_warning[]= 'NO SAFETY WARNING..';
        }
    }


var_dump($safety_warning);

对于描述文本,我使用xPath之类的

//*[@id="tabset_productPage"]/dd[1]

但问题是,使用所有这些,我完全得到安全警告和描述..

我的问题是,我想单独选择SAFETY WARNING和DESCRIPTION文本,但我总是将它们作为一个整体,包括安全警告和描述的完整文本,用于以上所有xPath。 另外,html结构并不总是相同的..有时可能会有<br> or <p>标签,

有人可以指导我吗?一些建议或外线如何实现这一目标?如何将安全警告/描述放在saparate列/变量中,而两者都是相同元素的子元素。

感谢..

2 个答案:

答案 0 :(得分:1)

安全警告是//dl[@id="tabset_productPage"]/dd[1]/的第一个文本子节点。要从选择中排除它,您可以选择位置大于1的所有文本节点。获取描述的查询如下所示:

$description_query='//dl[@id="tabset_productPage"]/dd[1]/text()[position()>1]';

我准备了一个测试它的例子。它来了:

$link = 'http://www.toysrus.com/product/index.jsp?productId=3685677&cp=2255956.2273442.2469772.3263938&green';

$html = file_get_contents($link);
$doc = new DOMDocument();
@$doc->loadHtml($html);

$selector = new DOMXPath($doc);

$safety_query='//*[@id="tabset_productPage"]/dd[1]/div/div/text()';
$safety = $selector->query($safety_query);
$safety_warning = $safety->item(0)->nodeValue;

echo 'Safety Warning: ', $safety_warning, PHP_EOL;

// select text nodes with a position greater than 1
$description_query='//dl[@id="tabset_productPage"]/dd[1]/text()[position()>1]';
$description_result = $selector->query($description_query);

$paragraphs = array();
foreach($description_result as $node) {
    $value = $node->nodeValue;
    if(trim($value) !== '') {
        $paragraphs []= $value;
    }   
}

$description = implode(PHP_EOL . PHP_EOL, $paragraphs);
echo 'Description: ', $description, PHP_EOL;

答案 1 :(得分:0)

你试过吗

//div[@class = "safetyWarning"]

用于安全警告和

//div[@id= "infoPanel"]/dl/dd/text()

产品说明?