【发布时间】:2019-04-03 00:00:30
【问题描述】:
在尝试解析 HTML 文件时陷入困境。
基础知识:
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTMLFile('myfile.html');
$xp = new DOMXPath($dom);
在这个初始化之后,我的技术是使用 XPATH 查询来获取我想要的变量。
如果有一个特定的项目或节点,我真的没有任何问题 - 非常容易查明和检索。
所以在我加载的 HTML 中,它基本上是在一个循环中形成的。缩小后看起来像这样:
<div class="intro">
<div class="desc-wrap">
Text Text Text
</div>
<div class="main-wrap">
<table class="table-wrap">
<tbody>
<tr>
<th class="range">Range </th>
<th>#1</th>
<th>#2</th>
</tr>
</tbody>
</table>
</div>
</div>
<div class="intro">
<div class="desc-wrap">
Text Text Text
</div>
<div class="main-wrap">
<table class="table-wrap">
<tbody>
<tr>
<th class="range">Range </th>
<th>#1</th>
<th>#2</th>
<th>#3</th>
<th>#4</th>
</tr>
</tbody>
</table>
</div>
</div>
这会持续 100 次(意味着 100 个 <div class="intro"> . . . </div> 实例
所以我试图获取desc-wrap 的内容(那里没问题)、文本节点以及每个表中有多少<th> 的计数。
考虑到一个 XPath 查询可能比两个更好,我查询了 div。
$intropath = $xp->query("//div[@class='intro']");
循环播放。
$f=1;
foreach ($intropath as $sp) {
echo $f++ . '<br />'; // Makes it way to 100, good.
我遇到的问题/核心问题是尝试计算每个表中 <th> 的数量。
$gettables = $xp->query("//div[contains(@class,'main-wrap')]/table[contains(@class, 'table-wrap')]//th", $sp);
var_dump($getsizes); // public 'length' => int 488
// Okay, so this is getting all the <th> elements in the
// entire document, not just in the loop. Maybe not what I want.
这是我尝试过的其他方法(我的意思是失败了)
好吧,让我们尝试只针对第一个表(在//th 之前添加[0]),看看我们能不能得到一些东西。
$gettables = $xp->query("//div[contains(@class,'main-wrap')]/table[contains(@class, 'table-wrap')][0]//th", $sp);
不。非对象。长度 0。不知道为什么。好的,让我们把它取下来。
也许试试这个?
//div[contains(@class,'main-wrap')]/table[contains(@class, 'table-wrap')]//th[count(following-sibling::*)]
好的。所以长度 = 100。必须得到一个 th 并进行推断。不是我想要的。
也许只是
//th[count(*)]
不。非对象。
也许是这个?
count(//div[contains(@class,'main-wrap')]/table[contains(@class, 'table-wrap')]//th)
不。更多非对象。
这可能已经足够我尝试过的例子了。
失败很有趣(好吧,学习),但我错过了什么?
我的输出...我只想找出每个表中有多少<th>。
所以,比如:
foreach ($intropath as $sp) {
$xpath = $xp->query("//actual/working/xpath/for/individual/th");
$thcount = count($getsizes->item(0)); // or something?
echo $thcount . '<br>';
在上面的例子中,会输出
3
5
当然还要继续其他 98 次迭代..
这可能很愚蠢。我一直在引用这个cheatsheet 和这个cheatsheet,我学到了很多关于XPATH 的功能,但是这个答案是在暗示我。在这一点上,我什至不确定做我的foreach ($intropath as $sp) { 是否是实现我正在做的事情的正确方法。
有人想把我从这个坑里挖出来,这样我就可以继续下一步和/或我的生活了吗?
【问题讨论】: