我有一个文件table.html,并希望得到这个值:$ age,$ height,$ weight
table.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 ”结果为年龄,但我希望它 24
如何以相同的代码获得高度和重量?
答案 0 :(得分: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
和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>
标签,也会返回正确的结果。它会打印出那里的任何值。
例如,如果缺少高度行,则输出:
Age = 24
Weight = 51
答案 1 :(得分: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
<强> Demo 强>
也适用于空白值。
修改; 强>
另一种方法是通过文本内容获取元素。
$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;
<强> Demo 强>
答案 2 :(得分:0)
$result = array();
foreach (array('age', 'height', 'weight') as $key => $value) {
$result[$value] = $xpath->query( '//td[@class="value"]')->item($key)->textContent;
}
print_r($result);