Php XPath刮削问题
我正在尝试使用xpath从营养网站获取结构化信息。问题是我需要的信息类别和实际信息都在同一个层次上。我想知道是否可以收集和组织数组中的数据(如下所示)。我已经尝试了一段时间,但没有成功 我感谢你的建议。提前谢谢 当前代码:Php XPath刮削问题,php,xpath,Php,Xpath,我正在尝试使用xpath从营养网站获取结构化信息。问题是我需要的信息类别和实际信息都在同一个层次上。我想知道是否可以收集和组织数组中的数据(如下所示)。我已经尝试了一段时间,但没有成功 我感谢你的建议。提前谢谢 当前代码: $query = "//a/@href | //h4/text()"; $nodes = $xpath->query($query); $info = array(); f
$query = "//a/@href | //h4/text()";
$nodes = $xpath->query($query);
$info = array();
foreach($nodes as $node){
$info[] = $node->textContent;
}
HTML
有两种不同的方法可以做到这一点: A) 以平面列表的形式查询所有感兴趣的元素,然后根据它们的节点名称手动聚合它们 代码:
$info=array();
foreach($xpath->query(//h4 |//a)作为$el){
如果($el->nodeName==“h4”)
$category=$el->textContent;
elseif(isset(类别))
$info[$category][]=$el->textContent;
}
B) 首先只查询'h4'元素,然后循环查询它们并为每个元素查询相应的'a'元素
在这种情况下,困难在于选择正确的“第二个查询”
- 如果您确信
和h4
元素总是像XML文档中的元素一样交替,没有例外,那么您可以使用ul
/以下同级::ul[1]/a
- 如果您确定
元素始终直接跟随相应的ul
元素,则可以使用h4
/以下同级::*[1][name()='ul']/a
- 如果这两件事都不能保证,那么用XPath编码将变得困难(甚至不可能),在这种情况下,我将使用解决方案A
$info=array();
foreach($xpath->query(//h4”)作为$category){
foreach($xpath->query(“./following sibling::ul[1]/a”,$category)作为$food){
$info[$category->textContent][=$food->textContent;
}
}
有两种不同的方法:
A) 以平面列表的形式查询所有感兴趣的元素,然后根据它们的节点名称手动聚合它们
代码:
$info=array();
foreach($xpath->query(//h4 |//a)作为$el){
如果($el->nodeName==“h4”)
$category=$el->textContent;
elseif(isset(类别))
$info[$category][]=$el->textContent;
}
B) 首先只查询'h4'元素,然后循环查询它们并为每个元素查询相应的'a'元素
在这种情况下,困难在于选择正确的“第二个查询”
- 如果您确信
和h4
元素总是像XML文档中的元素一样交替,没有例外,那么您可以使用ul
/以下同级::ul[1]/a
- 如果您确定
元素始终直接跟随相应的ul
元素,则可以使用h4
/以下同级::*[1][name()='ul']/a
- 如果这两件事都不能保证,那么用XPath编码将变得困难(甚至不可能),在这种情况下,我将使用解决方案A
$info=array();
foreach($xpath->query(//h4”)作为$category){
foreach($xpath->query(“./following sibling::ul[1]/a”,$category)作为$food){
$info[$category->textContent][=$food->textContent;
}
}
有两种不同的方法:
A) 以平面列表的形式查询所有感兴趣的元素,然后根据它们的节点名称手动聚合它们
代码:
$info=array();
foreach($xpath->query(//h4 |//a)作为$el){
如果($el->nodeName==“h4”)
$category=$el->textContent;
elseif(isset(类别))
$info[$category][]=$el->textContent;
}
B) 首先只查询'h4'元素,然后循环查询它们并为每个元素查询相应的'a'元素
在这种情况下,困难在于选择正确的“第二个查询”
- 如果您确信
和h4
元素总是像XML文档中的元素一样交替,没有例外,那么您可以使用ul
/以下同级::ul[1]/a
- 如果您确定
元素始终直接跟随相应的ul
元素,则可以使用h4
/以下同级::*[1][name()='ul']/a
- 如果这两件事都不能保证,那么用XPath编码将变得困难(甚至不可能),在这种情况下,我将使用解决方案A
$info=array();
foreach($xpath->query(//h4”)作为$category){
foreach($xpath->query(“./following sibling::ul[1]/a”,$category)作为$food){
$info[$category->textContent][=$food->textContent;
}
}
有两种不同的方法:
A) 以平面列表的形式查询所有感兴趣的元素,然后根据它们的节点名称手动聚合它们
代码:
$info=array();
foreach($xpath->query(//h4 |//a)作为$el){
如果($el->nodeName==“h4”)
$category=$el->textContent;
elseif(isset(类别))
$info[$category][]=$el->textContent;
}
B) 首先只查询'h4'元素,然后循环查询它们并为每个元素查询相应的'a'元素
在这种情况下,困难在于选择正确的“第二个查询”
- 如果您确信
和h4
元素总是像XML文档中的元素一样交替,没有例外,那么您可以使用ul
/以下同级::ul[1]/a
- 如果您确定
元素始终直接跟随相应的ul
元素,则可以使用h4
/以下同级::*[1][name()='ul']/a
- 如果这两件事都不能保证,那么用XPath编码将变得困难(甚至不可能),在这种情况下,我将使用解决方案A
$info=array();
foreach($xpath->query(//h4”)作为$category){
foreach($xpa)
<h4>Fruits</h4>
<ul>
<a href="link1">Apples</a>
<a href="link2">Peaches</a>
<a href="link3">Pears</a>
</ul>
<h4>Veggies</h4>
<ul>
<a href="link4">Tomato</a>
<a href="link5">Onion</a>
<a href="link6">Mushroom</a>
</ul>
<h4>Junkfood</h4>
<ul>
<a href="link7">Pizza</a>
<a href="link8">Cola</a>
<a href="link9">Hotdog</a>
</ul>
$info = array(
"fruits" => array("apples", "peaches", "pears"),
"veggies" => array("tomato", "onion", "mushroom"),
"junkfood" => array("pizza", "cola", "hotdog")
);
$query = "//a | //h4";
$nodes = $xpath->query($query);
foreach($nodes as $node)
{
if($node->nodeName == 'h4')
$arraykey = $node->nodeValue;
else
$info[$arraykey][] = $node->nodeValue;
}