簡體   English   中英

基於tr計數的td / th的XPath

[英]XPath for td/th based on tr count

使用XPath進行webscrape。

結構是:

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

但其中一個tr只包含一個或一個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。 這導致了問題。 第2或第3表也有同樣的問題。

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

將選擇所有th所有內的元件table具有元素多於一個tr后代(不管是否tbody存在)。


這個XPath,

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

將選擇具有多個子元素的tr元素的所有子元素。


這個XPath,

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

將選擇tr元素的所有子元素,其中th元素的數量等於td子元素的數量。


OP發布了該網站的鏈接。 根元素位於xmlns="http://www.w3.org/1999/xhtml"命名空間中。

請參閱XPath如何處理XML命名空間?

如果我理解正確的話,你想th中的元素tr s表示包含兩個元素? 我認為這就是你需要的:

//th[count(../*) = 2]

我在答案中包含了一個更明確的路徑,其中包含一個or語句來計算TH和TD元素

$html = '
  <html>
    <body>
      <table>
        <tbody>
          <tr>
            <th>I am Included</th>
            <td>I am a column</td>
          </tr>
        </tbody>
      </table>
      <table>
        <tbody>
          <tr>
            <th>I am ignored</th>
          </tr>
        </tbody>
      </table>
      <table>
        <tbody>
          <tr>
            <th>I am also Included</th>
            <td>I am a column</td>
          </tr>
        </tbody>
      </table>
    </body>
  </html>
';

$doc = new DOMDocument();
$doc->loadHTML( $html );

$xpath = new DOMXPath( $doc );
$result = $xpath->query("//table[ count( tbody/tr/td | tbody/tr/th ) > 1 ]/tbody/tr");

foreach( $result as $node )
{
  var_dump( $doc->saveHTML( $node ) );
}

// string(88) "<tr><th>I am Included</th><td>I am a column</td></tr>"
// string(93) "<tr><th>I am also Included</th><td>I am a column</td></tr>"

您也可以將此用於任何深度后代

//table[ count( descendant::td | descendant::th ) > 1]//tr

在條件(方括號部分)之后更改xpath以更改返回的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM