php - 基于 tr 计数的 td/th 的 XPath

标签 php html xml xpath

使用 XPath 进行网络抓取。

结构是:

<table>
  <tbody>
     <tr>
        <th>
        <td>

但是其中一个 tr 只包含一个 th 或一个 td。

<table>
      <tbody>
         <tr>
            <th>

所以我只想抓取 TR 中是否包含两个标签。我给路径

 $route = $path->query("//table[count(tr) > 1]//tr/th");

 $route = $path->query("//table[count(tr) > 1]//tr/td");

但它不起作用。

我在这里给出了 orjinal 表的链接。第一张表的最后两个 TR 只有一个 TD。这就是问题所在。第二个或第三个表也有同样的问题。

https://www.daiwahouse.co.jp/mansion/kanto/tokyo/y35/gaiyo.html

      $route = $path->query("//tr[count(*) >= 2]/th");
      foreach ($route as $th){
          $property[] = trim($th->nodeValue);
      }

      $route = $path->query("//tr[count(*) >= 2]/td");
      foreach ($route as $td){
          $value[] = trim($td->nodeValue);
      }

我正在尝试同时选择 TH 和 TD。但是如果 TR 包含一个 TD 那么它就会引起问题。因为在 TD 计数和 TH 计数中我抓取的 TD 比 TH 多

最佳答案

这个 XPath,

//table[count(.//tr) > 1]/th

将选择所有 table 元素中具有多个 tr 后代的所有 th 元素(无论 tbody存在)。


这个 XPath,

//tr[count(*) > 1]/*

将选择具有多个子元素的 tr 元素的所有子元素。


这个 XPath,

//tr[count(th) = count(td)]/*

将选择 tr 元素的所有子元素,其中 th 子元素的数量等于 td 子元素的数量。


OP 发布了该网站的链接。根元素位于 xmlns="http://www.w3.org/1999/xhtml" 命名空间中。

参见 How does XPath deal with XML namespaces?

关于php - 基于 tr 计数的 td/th 的 XPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54358529/

相关文章:

xml - 仅当前面的兄弟节点的子节点不是某个节点时,XSL 模板才匹配

php - 如何将主键作为外键插入到另一个表中?

php - 在 x 个字符后分割字符串

html - Firefox CSS 问题 <a> 内部倾斜的 div

java - Android性能优化问题(Layout with JustifiedTextViews and CodeViews)

xml - 使用 XSLT 展平 XML,但基于嵌套级别

PHP 将 html 转换为空格,> 到 > 等

php - 数据无法在表单中显示

javascript - 文件上传在 extJS 中隐藏文本字段

python - 在 Html 输出中删除 Unicode 标记