Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php XPath刮削问题_Php_Xpath - Fatal编程技术网

Php XPath刮削问题

Php XPath刮削问题,php,xpath,Php,Xpath,我正在尝试使用xpath从营养网站获取结构化信息。问题是我需要的信息类别和实际信息都在同一个层次上。我想知道是否可以收集和组织数组中的数据(如下所示)。我已经尝试了一段时间,但没有成功 我感谢你的建议。提前谢谢 当前代码: $query = "//a/@href | //h4/text()"; $nodes = $xpath->query($query); $info = array(); f

我正在尝试使用xpath从营养网站获取结构化信息。问题是我需要的信息类别和实际信息都在同一个层次上。我想知道是否可以收集和组织数组中的数据(如下所示)。我已经尝试了一段时间,但没有成功

我感谢你的建议。提前谢谢

当前代码:

            $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
    ul
    元素总是像XML文档中的元素一样交替,没有例外,那么您可以使用
    /以下同级::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
    ul
    元素总是像XML文档中的元素一样交替,没有例外,那么您可以使用
    /以下同级::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
    ul
    元素总是像XML文档中的元素一样交替,没有例外,那么您可以使用
    /以下同级::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
    ul
    元素总是像XML文档中的元素一样交替,没有例外,那么您可以使用
    /以下同级::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;
 }