卡在一个兔子洞中,试图解析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…