使用XPath计算每个表中的TH数 - php

卡在一个兔子洞中,试图解析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次(表示<div class="intro"> . . . </div>的100个实例
因此,我试图获取desc-wrap的内容(那里没有问题),以及文本节点以及每个表中有多少<th>的计数。
我认为div可能是一个XPath查询可能优于两个查询。

$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.

这是我尝试过的其他事情(我的意思是失败了)
好吧,让我们尝试仅定位第一个表(在[0]之前添加//th),看看是否可以得到一些东西。

$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::*)]

好的。所以Length =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) {是否是实现我正在做的事情的正确方法。
任何人都想把我从这个洞里挖出来,这样我就可以继续下一步和/或我的生活了吗?

参考方案

使用迭代的query()调用计算合格节点。

代码:(Demo)

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);
$xp = new DOMXPath($dom);
foreach ($xp->query("//div[contains(@class,'main-wrap')]/table[contains(@class, 'table-wrap')]//tr") as $node) {
    echo $xp->query("th", $node)->length , "\n";
}

输出:

3
5

代码未在服务器目录php中创建文件 - php

我正在尝试使用以下代码将新文件写入服务器error_reporting(E_ALL); ini_set('display_errors', 1); if($_SERVER['REQUEST_METHOD'] == "POST") { $html = $_POST['html'];…

CodeIgniter更新查询被执行两次 - php

我正在使用CodeIgniter 2.2。每次访问页面时,我都必须用+1更新数据库。代码可以工作,但是每次都会增加+2。示例:如果是total views=2,则在单击页面后total views应该是3,但是数据库中的值是4。我确定我在控制器中仅调用一次模型add_one_to_view_image。控制者 function view(){ $view_i…

故障排除“警告:session_start():无法发送会话高速缓存限制器-标头已发送” - php

我收到警告:session_start()[function.session-start]:无法发送会话缓存限制器-标头已发送(错误输出开始如果我将表单数据提交到其他文件进行处理,则可以正常工作。但是,如果我将表单数据提交到同一页面,则会出现此错误。请建议<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0…

通过php表单修改我的xml文件 - php

这是我的xml文件和下面的php代码。我输入了一个输入类型,它将按名字搜索学生。然后将显示有关特定学生的信息,并且将显示另一个按钮更新。问题是我想在那之后修改信息。如何通过标签名称获取元素,以便可以修改有关特定学生的信息?<students> <student> <firstname>John</firstname&…

在ajax之后将页面内容复制到同一页面 - php

我有简单的注册公式,我希望首先使用ajax发送,而不刷新页面以控制是否插入正确的数据,然后仅重定向到其他页面。问题是,当我通过ajax将其发送到同一页面后,一切正常,但是页面内容重复,我可以看到两次...这是我的ajaxfunction registruj () { var name = $('#meno').val(); var pri…