我可以将 domxpath 嵌套 类 的结果放入一个带有键 => 值的数组中吗?
Can I get the result of domxpath nested classes into an array with keys => value?
我正在为客户从网页获取一些数据并且工作正常,它通过将 \n 分解为新行来获取单独行中的所有数据,然后我将这些数据映射到特定的数组数据以填充表单字段。对于每个需要的值都是这样:
$lines = explode("\n", $html);
$data['vraagprijs'] = preg_replace("/[^0-9]/", "", $lines[5]);
但是,我需要的数据今天可能在第 10 行,但很可能明天在第 11 行。所以我想将值放入命名数组中。 URL上的HTML示例如下:
<div class="item_list">
<span class="item first status">
<span class="itemName">Status</span>
<span class="itemValue">Sold</span>
</span>
<span class="item price">
<span class="itemName">Vraagprijs</span>
<span class="itemValue">389.000</span>
</span>
<span class="item condition">
<span class="itemName">Aanvaarding</span>
<span class="itemValue">In overleg</span>
</span>
...
</div>
这是我的函数模型:
$tagName3 = 'div';
$attrName3 = 'class';
$attrValue3 = 'item_list';
$html = getShortTags($tagName3, $attrName3, $attrValue3, $url);
function getShortTags($tagName, $attrName, $attrValue, $url = "", $exclAttrValue = 'itemTitle') {
$dom = $this->getDom($url);
$html = '';
$domxpath = new \DOMXPath($dom);
$newDom = new \DOMDocument;
$newDom->formatOutput = true;
$filtered = $domxpath->query(" //" . $tagName . "[@" . $attrName . "='" . $attrValue . "']/descendant::text()[not(parent::span/@" . $attrName . "='" . $exclAttrValue . "')] ");
$i = 0;
while ($myItem = $filtered->item($i++)) {
$node = $newDom->importNode($myItem, true);
$newDom->appendChild($node);
}
$html = $newDom->saveHTML();
return $html;
}
我得到了什么?
Status\nSold\nVraagprijs\n389.000\nIn overleg\n....
想要的输出类似于:
$html = array("Status" => "Sold", "Vraagprijs" => "389.000", "Aanvaarding" => "In overleg", ...)
有没有办法 "loop" 通过 itemList 并将每个 itemName 和 itemValue 放入关联数组中?
如果您对 getShortTags()
方法的作用感到满意(或者如果它在其他地方使用并且很难调整),那么您可以处理 return 值。
此代码首先使用explode()
按行拆分输出,使用array_map()
和trim()
删除任何空格等,然后通过array_filter()
传递结果删除空行。这会将数据成对保留,因此一种简单的方法是使用 array_chunk()
提取对,然后 foreach()
以第一个作为键,第二个作为值...
$html = getShortTags($tagName3, $attrName3, $attrValue3, $url);
$lines = array_filter(array_map("trim", explode(PHP_EOL, $html)));
$pairs = array_chunk($lines, 2);
$output = [];
foreach ( $pairs as $pair ) {
$output[$pair[0]] = $pair[1];
}
print_r($output);
样本数据给出..
Array
(
[Status] => Sold
[Vraagprijs] => 389.000
[Aanvaarding] => In overleg
)
直接在文档中使用它而不做任何假设(尽管如果您没有多个值的名称,那么不确定您最终会得到什么)。这只是专门查找基本元素,然后遍历 <span>
元素。每次在此范围内,它都会查找 itemName
和 itemValue
class 属性并从中获取值...
$output = [];
$filtered = $domxpath->query("//div[@class='item_list']/span");
foreach ( $filtered as $myItem ) {
$name= $domxpath->evaluate("string(descendant::span[@class='itemName'])", $myItem);
$value= $domxpath->evaluate("string(descendant::span[@class='itemValue'])", $myItem);
$output[$name] = $value;
}
print_r($output);
我正在为客户从网页获取一些数据并且工作正常,它通过将 \n 分解为新行来获取单独行中的所有数据,然后我将这些数据映射到特定的数组数据以填充表单字段。对于每个需要的值都是这样:
$lines = explode("\n", $html);
$data['vraagprijs'] = preg_replace("/[^0-9]/", "", $lines[5]);
但是,我需要的数据今天可能在第 10 行,但很可能明天在第 11 行。所以我想将值放入命名数组中。 URL上的HTML示例如下:
<div class="item_list">
<span class="item first status">
<span class="itemName">Status</span>
<span class="itemValue">Sold</span>
</span>
<span class="item price">
<span class="itemName">Vraagprijs</span>
<span class="itemValue">389.000</span>
</span>
<span class="item condition">
<span class="itemName">Aanvaarding</span>
<span class="itemValue">In overleg</span>
</span>
...
</div>
这是我的函数模型:
$tagName3 = 'div';
$attrName3 = 'class';
$attrValue3 = 'item_list';
$html = getShortTags($tagName3, $attrName3, $attrValue3, $url);
function getShortTags($tagName, $attrName, $attrValue, $url = "", $exclAttrValue = 'itemTitle') {
$dom = $this->getDom($url);
$html = '';
$domxpath = new \DOMXPath($dom);
$newDom = new \DOMDocument;
$newDom->formatOutput = true;
$filtered = $domxpath->query(" //" . $tagName . "[@" . $attrName . "='" . $attrValue . "']/descendant::text()[not(parent::span/@" . $attrName . "='" . $exclAttrValue . "')] ");
$i = 0;
while ($myItem = $filtered->item($i++)) {
$node = $newDom->importNode($myItem, true);
$newDom->appendChild($node);
}
$html = $newDom->saveHTML();
return $html;
}
我得到了什么?
Status\nSold\nVraagprijs\n389.000\nIn overleg\n....
想要的输出类似于:
$html = array("Status" => "Sold", "Vraagprijs" => "389.000", "Aanvaarding" => "In overleg", ...)
有没有办法 "loop" 通过 itemList 并将每个 itemName 和 itemValue 放入关联数组中?
如果您对 getShortTags()
方法的作用感到满意(或者如果它在其他地方使用并且很难调整),那么您可以处理 return 值。
此代码首先使用explode()
按行拆分输出,使用array_map()
和trim()
删除任何空格等,然后通过array_filter()
传递结果删除空行。这会将数据成对保留,因此一种简单的方法是使用 array_chunk()
提取对,然后 foreach()
以第一个作为键,第二个作为值...
$html = getShortTags($tagName3, $attrName3, $attrValue3, $url);
$lines = array_filter(array_map("trim", explode(PHP_EOL, $html)));
$pairs = array_chunk($lines, 2);
$output = [];
foreach ( $pairs as $pair ) {
$output[$pair[0]] = $pair[1];
}
print_r($output);
样本数据给出..
Array
(
[Status] => Sold
[Vraagprijs] => 389.000
[Aanvaarding] => In overleg
)
直接在文档中使用它而不做任何假设(尽管如果您没有多个值的名称,那么不确定您最终会得到什么)。这只是专门查找基本元素,然后遍历 <span>
元素。每次在此范围内,它都会查找 itemName
和 itemValue
class 属性并从中获取值...
$output = [];
$filtered = $domxpath->query("//div[@class='item_list']/span");
foreach ( $filtered as $myItem ) {
$name= $domxpath->evaluate("string(descendant::span[@class='itemName'])", $myItem);
$value= $domxpath->evaluate("string(descendant::span[@class='itemValue'])", $myItem);
$output[$name] = $value;
}
print_r($output);