我正在尝试使用 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>
答案 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
?>