2

我有一个文件 table.html 并想得到这个值: $age, $height, $weight

表.html:

<tr><td class="key">Age</td><td class="value">24</td></tr>
<tr><td class="key">Height</td><td class="value">169</td></tr>
<tr><td class="key">Weight</td><td class="value">51</td></tr>

到目前为止,我已经制作了这段代码:

$html = file_get_contents("table.html");

libxml_use_internal_errors( true);
$doc = new DOMDocument;
$doc->loadHTML( $html);
$xpath = new DOMXpath( $doc);

// A name attribute on a <td>
$age = $xpath->query( '//td[@class="key"]')->item( 0);

echo $age->textContent;

$age的“ echo ”结果是Age但我希望它是24

如何在相同的代码中获得身高和体重结果?

4

3 回答 3

2

您想要的类名是value,而不是key,因此您需要相应地修改 XPath 表达式:

$result = $xpath->query( '//td[@class="value"]');

$age = $result->item(0)->textContent;
$height = $result->item(1)->textContent;
$weight = $result->item(2)->textContent;

请注意,我已经删除了另外两个 XPath 调用。正如 Jonathan 在下面的评论中指出的那样,一个调用就足够了,其余的项目可以从生成的 NodeList 中检索。

至于输出检索到的值,您可以简单地使用echo, with isset()。这是为了确保仅在设置数量时才回显数量:

echo (isset($age)) ? "Age: $age\n" : '';
echo (isset($age)) ? "Height: $height\n" : '';
echo (isset($age)) ? "Weight: $weight\n" : '';

上面的代码应该产生:

Age: 24
Height: 169
Weight: 51

演示!


更新

正如您在评论中指出的那样,如果其中一个<tr>块不存在,这将失败。在这种情况下,您可以简单地使用foreach循环来显示项目:

$quantities = $xpath->query( '//td[@class="key"]');
$values = $xpath->query('//td[@class="value"]');

foreach ($values as $key => $value) {
    echo $quantities->item($key)->textContent .' = '. $value->textContent."\n";
}

这将返回正确的结果,即使一个(或多个)<tr>标签不存在。它会打印出那里的任何值。

例如,如果缺少 Height 行,那么它会输出:

Age = 24
Weight = 51

演示!

于 2013-10-13T18:40:54.100 回答
0

如果您知道文件的明确结构,这样的事情就可以了;使用->nextSibling, 和->item(i)

$html = file_get_contents("table.html");

libxml_use_internal_errors( true);
$doc = new DOMDocument;
$doc->loadHTML( $html);
$xpath = new DOMXpath( $doc);

// A name attribute on a <td>
$age     = $xpath->query( '//td[@class="key"]')->item( 0);
$height  = $xpath->query( '//td[@class="key"]')->item( 1);
$weight  = $xpath->query( '//td[@class="key"]')->item( 2);

echo "\nAge: "    . $age->nextSibling->textContent;
echo "\nHeight: " . $height->nextSibling->textContent;
echo "\nWeight: " . $weight->nextSibling->textContent;

输出将是:

Age: 24
Height: 169
Weight: 51

演示

也适用于空白值。

编辑;

另一种方法是通过其文本内容获取元素。

$html = file_get_contents("table.html");

libxml_use_internal_errors( true);
$doc = new DOMDocument;
$doc->loadHTML( $html);
$xpath = new DOMXpath( $doc);

// A name attribute on a <td>
$age     = $xpath->query( '//td[text()="Age"]')->item( 0);
$height  = $xpath->query( '//td[text()="Height"]')->item( 0);
$weight  = $xpath->query( '//td[text()="Weight"]')->item( 0);

echo "\nAge: "    . $age->nextSibling->textContent;
echo "\nHeight: " . $height->nextSibling->textContent;
echo "\nWeight: " . $weight->nextSibling->textContent;

演示

于 2013-10-13T18:41:07.667 回答
0
$result = array();
foreach (array('age', 'height', 'weight') as $key => $value) {
    $result[$value] = $xpath->query( '//td[@class="value"]')->item($key)->textContent;
}

print_r($result);
于 2013-10-13T18:49:02.350 回答