遍历元素并使用 PHP 中的 DOMDocument() 解析它们
Loop through elements and parse them whith DOMDocument() in PHP
我有一个这样的项目列表:
<div class="list">
<div class="ui_checkbox type hidden" data-categories="57 48 ">
<input id="attraction_type_119" type="checkbox" value="119"
<label for="attraction_type_119">Aquariums</label>
</div>
<div class="ui_checkbox type " data-categories="47 ">
<input id="attraction_type_120" type="checkbox" value="120"
<label for="attraction_type_120">Arènes et stades</label>
</div>
</div>
如何使用 DOMDocument
遍历它们以获取如下详细信息:
- 数据类别
- 输入值
- 标签文字
这是我试过的:
$dom = new DOMDocument();
$dom->loadHTML($html);
$xp = new DOMXpath($dom);
$elements = $dom->getElementsByTagName('div');
$data = array();
foreach($elements as $node){
foreach($node->childNodes as $child) {
$data['data_categorie'] = $child->item(0)->getAttribute('data_categories');
$data['input_value'] = $child->item(0)->getAttribute('input_value');
$data['label_text'] = $child->item(0)->getAttribute('label_text');
}
}
但是没用。
请问我在这里遗漏了什么?
谢谢。
我使用 string()
和 evaluate
在单个查询中获得结果:
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$elements = $xpath->query('//div[contains(@class, "ui_checkbox")]');
foreach($elements as $node) {
$data = array();
$data['data_categorie'] = $xpath->evaluate('string(./@data-categories)', $node);
$data['input_value'] = $xpath->evaluate('string(./input/@value)', $node);
$data['label_text'] = $xpath->evaluate('string(./label/text())', $node);
}
像这样在循环中设置多个值 $data['data_categorie'] =
对数组使用相同的键 $data = array();
将在每次迭代时覆盖这些值。
由于您有多个项目,您可以创建一个临时数组 $temp = [];
来存储值,并在存储当前迭代的所有值后将该数组添加到 $data
数组。
因为您已经在使用 DOMXpath,您可以使用 class="list" 使用表达式获得 div像 //div[@class="list"]/div
并循环检查 nodeName input 的子节点并获取该值加上下一个兄弟节点的值,即 label[=32 的值=]
$data = array();
$xp = new DOMXpath($dom);
$items = $xp->query('//div[@class="list"]/div');
foreach($items as $item) {
$temp["data_categorie"] = $item->getAttribute("data-categories");
foreach ($item->childNodes as $child) {
if ($child->nodeName === "input") {
$temp["input_value"] = $child->getAttribute("value");
$temp["label_text"] = $child->nextSibling->nodeValue;
}
}
$data[] = $temp;
}
print_r($data);
输出
Array
(
[0] => Array
(
[data_categorie] => 57 48
[input_value] => 119
[label_text] => Aquariums
)
[1] => Array
(
[data_categorie] => 47
[input_value] => 120
[label_text] => Arènes et stades
)
)
我有一个这样的项目列表:
<div class="list">
<div class="ui_checkbox type hidden" data-categories="57 48 ">
<input id="attraction_type_119" type="checkbox" value="119"
<label for="attraction_type_119">Aquariums</label>
</div>
<div class="ui_checkbox type " data-categories="47 ">
<input id="attraction_type_120" type="checkbox" value="120"
<label for="attraction_type_120">Arènes et stades</label>
</div>
</div>
如何使用 DOMDocument
遍历它们以获取如下详细信息:
- 数据类别
- 输入值
- 标签文字
这是我试过的:
$dom = new DOMDocument();
$dom->loadHTML($html);
$xp = new DOMXpath($dom);
$elements = $dom->getElementsByTagName('div');
$data = array();
foreach($elements as $node){
foreach($node->childNodes as $child) {
$data['data_categorie'] = $child->item(0)->getAttribute('data_categories');
$data['input_value'] = $child->item(0)->getAttribute('input_value');
$data['label_text'] = $child->item(0)->getAttribute('label_text');
}
}
但是没用。
请问我在这里遗漏了什么?
谢谢。
我使用 string()
和 evaluate
在单个查询中获得结果:
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$elements = $xpath->query('//div[contains(@class, "ui_checkbox")]');
foreach($elements as $node) {
$data = array();
$data['data_categorie'] = $xpath->evaluate('string(./@data-categories)', $node);
$data['input_value'] = $xpath->evaluate('string(./input/@value)', $node);
$data['label_text'] = $xpath->evaluate('string(./label/text())', $node);
}
像这样在循环中设置多个值 $data['data_categorie'] =
对数组使用相同的键 $data = array();
将在每次迭代时覆盖这些值。
由于您有多个项目,您可以创建一个临时数组 $temp = [];
来存储值,并在存储当前迭代的所有值后将该数组添加到 $data
数组。
因为您已经在使用 DOMXpath,您可以使用 class="list" 使用表达式获得 div像 //div[@class="list"]/div
并循环检查 nodeName input 的子节点并获取该值加上下一个兄弟节点的值,即 label[=32 的值=]
$data = array();
$xp = new DOMXpath($dom);
$items = $xp->query('//div[@class="list"]/div');
foreach($items as $item) {
$temp["data_categorie"] = $item->getAttribute("data-categories");
foreach ($item->childNodes as $child) {
if ($child->nodeName === "input") {
$temp["input_value"] = $child->getAttribute("value");
$temp["label_text"] = $child->nextSibling->nodeValue;
}
}
$data[] = $temp;
}
print_r($data);
输出
Array
(
[0] => Array
(
[data_categorie] => 57 48
[input_value] => 119
[label_text] => Aquariums
)
[1] => Array
(
[data_categorie] => 47
[input_value] => 120
[label_text] => Arènes et stades
)
)