8

我正在解析如下所示的 html:

  <table class="linesTbl">
        <tr class="linesHeader">
            <td><h3>EventName</h3></td>
        </tr><tr class="linesColumns">
            <td>Date</td><td class="contestLine">Description</td>
        </tr><tr class="linesAlt1">
            <td>Time</td><td>X1</td><td>Price1</td>
        </tr><tr class="linesAlt1">
            <td>&nbsp;</td><td>X2</td><td>Price2</td></tr>
</table>

有多个这样的表,所以我试图遍历它们并获取所有数据。我不确定 xpath 如何处理 php 中的查询。目前我只是想从每个表中提取 EventName 。

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

foreach ($xpath->query("//table[@class = 'linesTbl']") as $tableNode){

  $headerTag = $xpath->query(".//h3", $tableNode);
  echo $headerTag->nodeValue;

}

对于 $headerTag 查询,我也尝试过query("./tr/td/h3", $tableNode)。我该如何做这个相对查询?

4

2 回答 2

15

您的 xpath 表达式已经是相对的:

$headerTag = $xpath->query(".//h3", $tableNode);
                            ^       ^^^^^^^^^^
                            |    relative-to node
                       relative path

但是,这会返回一个节点列表,而不是单个节点,所以如果你这样做:

echo $headerTag->item(0)->nodeValue;
               ^^^^^^^^^

您可以访问所需的元素,查看输出:

EventName

我希望这是有帮助的。

于 2012-07-15T19:17:12.860 回答
0

实际上,您的 html 不正确。

关于 XPATH,您可以通过这种方式专门针对h3标记:-

/table[@class='linesTbl']/tr[@class='linesHeader']/td/h3
于 2012-07-15T19:20:09.227 回答