使用xPath& PHP循环遍历HTML并提取所需的属性&文本?

时间:2014-03-10 20:16:36

标签: php parsing xpath

我正在尝试使用 PHP xPath HTML 文件中提取各种文本和属性。

所需的输出是这样的:

 Item1 | level1 = AAAA | level 2 = aaa.com | text

我可以构造xpath但是我在创建必要的循环来循环遍历文件时遇到了麻烦。 这样做的最佳方法是什么?

示例HTML - 章节和子章节(第1项至第999项):

 <div class=container1>
    <div class=item1>

          <div class=level1>
               <h1>AAAA</h1>
          </div>

          <div class=level2>
               <a href=aaa.com>text</a>
               <p>text</p>
          </div>

    </div>


          ..

    <div class=item2>

          ..

 </div>

1 个答案:

答案 0 :(得分:1)

我已嵌入xml并使用loadXML()代替load()

请注意它有点暧昧,你在href之后指的是“文字”, 来自href <a href=aaa.com>text</a>的文字或来自<p>text</p>的文字。 我的解决方案使用来自href。

的文本

<强>输出

item1 | level1 = AAAA | level2 = aaa.com | atext1

item2 | level1 = BBBB | level2 = bbb.com | btext1

<强>解决方案

<?php

// from your file
$xml = '
<div class="container1">
  <div class="item1">
    <div class="level1">
      <h1>AAAA</h1>
    </div>
    <div class="level2">
      <a href="aaa.com">atext1</a>
      <p>atext2</p>
    </div>
  </div>

  <div class="item2">
    <div class="level1">
      <h1>BBBB</h1>
    </div>
    <div class="level2">
      <a href="bbb.com">btext1</a>
      <p>btext2</p>
    </div>
  </div>
</div>
';

$xmldoc = new DOMDocument();
//$xmldoc->load('yourFile.html');
$xmldoc->loadXML($xml);

$xpath = new Domxpath($xmldoc);

foreach($xpath->query("//div[contains(@class,'item')]") as $node){

    echo $node->getAttribute('class') . ' | '; // item 1

    $div = $node->getElementsByTagName('div');
    foreach($div as $i) {

        if($i->getAttribute('class') === 'level1') {
            echo $i->getAttribute('class') . ' = ' . $i->nodeValue . ' | ';
        }

        if($i->getAttribute('class') === 'level2') {

            echo $i->getAttribute('class') . ' = ';

            foreach($i->childNodes as $node){
                if($node instanceOf DomElement && $node->hasAttribute('href')) {
                    echo $node->getAttribute('href') . ' | ' . $node->nodeValue;
                }
            }
        }
    }

    echo '<br>';
}

// Item1 | level1 = AAAA | level 2 = aaa.com | text2
?>