Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.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类型的查询: 虽然我已经开始稍微了解所有内容,但我想进一步尝试使用嵌套循环提取代码来提取嵌套元素,然后对它们进行分类。我只是以craigslist为例,因为他们在视频中开始了它,并在他们的“站点”网页下列出了它 我不得不重写它,因为在它有一个无限循环之前。现在,如果有人知道一个更好的写作方法,我会喜欢输入,但这就是我所拥有的 我一直在尝试将结果转换成以下格式 国家/地区-州-城市名称文本-城市名称href 当然,cityNameHref=链接到城市 现

我一直在尝试从这个视频学习如何使用Xpath类型的查询:

虽然我已经开始稍微了解所有内容,但我想进一步尝试使用嵌套循环提取代码来提取嵌套元素,然后对它们进行分类。我只是以craigslist为例,因为他们在视频中开始了它,并在他们的“站点”网页下列出了它

我不得不重写它,因为在它有一个无限循环之前。现在,如果有人知道一个更好的写作方法,我会喜欢输入,但这就是我所拥有的

我一直在尝试将结果转换成以下格式

国家/地区-州-城市名称文本-城市名称href

当然,cityNameHref=链接到城市

现在,我只是让它打印内部的结果,其中列出了实际的城市,因为craigslist的格式是

<h1>CountryName</h1>
<div class="colmask">
 <div>
  <h4>StateName</h4>
  <ul>
   <li>
    <a href="CityNameHREF">CityName</a>
   </li>
   <li>
    <a href="CityNameHREF">CityName</a>
   </li>
       <li>
    <a href="CityNameHREF">CityName</a>
   </li>
   <li>
    <a href="CityNameHREF">CityName</a>
   </li>
  </ul>
 </div>
</div>
CountryName
州名
正如你所看到的,它的内部嵌套非常复杂。我花了12个小时的时间试图让它工作。这是我所得到的最接近于显示UL节点值的城市名称。但我不知道如何让这些城市以我上面列出的格式正确显示

现在开始我的代码

$url = 'http://www.craigslist.org/about/sites';
$output = file_get_contents($url); 
$doc = new DOMDocument();

  libxml_use_internal_errors(true); //Supress Warnings for HTML5 conversion issue
  $doc->loadHTML($output);
  libxml_use_internal_errors(false); //Start Showing Errors

  $xpath = new DOMXpath($doc);


foreach ($xpath->query('//h1') as $e) 
    {
            $country = $e->nodeValue;
            $list = array();


            foreach ($xpath->query('//div[@class="colmask"]/div', $e) as $li) 
            {

                $state = $li->nodeValue;    
                    echo "<pre>";


                    $result = $xpath->query('//div[@class="colmask"]/div/ul', $e);


                    for ($i = 0; $i <= 10; $i++) //10 instead so it doesn't lag out
                    {


                    print_r($result->item($i));   //Displays the UL nodeValue
                    }


            }
    }  
$url='1!'http://www.craigslist.org/about/sites';
$output=file\u get\u contents($url);
$doc=新的DOMDocument();
libxml\u使用\u内部错误(true)//针对HTML5转换问题的Suppress警告
$doc->loadHTML($output);
libxml\u使用\u内部错误(false)//开始显示错误
$xpath=新的DOMXpath($doc);
foreach($xpath->query('//h1')作为$e)
{
$country=$e->nodeValue;
$list=array();
foreach($xpath->query('//div[@class=“colmask”]/div',$e)作为$li)
{
$state=$li->nodeValue;
回声“;
$url = 'http://www.craigslist.org/about/sites';
$output = file_get_contents($url);
$doc = new DOMDocument();

libxml_use_internal_errors(true); //Supress Warnings for HTML5 conversion issue
$doc->loadHTML($output);
libxml_use_internal_errors(false); //Start Showing Errors

$xpath = new DOMXpath($doc);

foreach ($xpath->query('//h1') as $e) {
    $country = trim($e->textContent);

    foreach ($xpath->query('following-sibling::div[1]//h4', $e) as $h4) {
        $state = trim($h4->textContent);

        foreach ($xpath->query('following-sibling::ul[1]//li/a', $h4) as $a) {
                $town = $a->textContent;
                $attributeNodeMap = $a->attributes;
                $nodeAttribute = $attributeNodeMap->getNamedItem("href");
                $href = trim($nodeAttribute->nodeValue);

                echo "$country - $state - $town - $href<br>";
        }
    }
}
$result=$xpath->query('//div[@class=“colmask”]/div/ul',$e); 对于($i=0;$i请尝试以下方法:

$url='1!'http://www.craigslist.org/about/sites';
$output=file\u get\u contents($url);
$doc=新的DOMDocument();
libxml_use_internal_errors(true);//针对HTML5转换问题的Superss警告
$doc->loadHTML($output);
libxml_use_internal_errors(false);//开始显示错误
$xpath=新的DOMXpath($doc);
foreach($xpath->query('//h1')作为$e){
$country=trim($e->textContent);
foreach($xpath->query('following-sibling::div[1]//h4',$e)作为$h4){
$state=trim($h4->textContent);
foreach($xpath->query('following-sibling::ul[1]//li/a',$h4)作为$a){
$town=$a->textContent;
$attributeNodeMap=$a->attributes;
$nodeAttribute=$attributeNodeMap->getNamedItem(“href”);
$href=trim($nodeAttribute->nodeValue);
回声“$country-$state-$town-$href
”;
$url = 'http://www.craigslist.org/about/sites';
$output = file_get_contents($url);
$doc = new DOMDocument();

libxml_use_internal_errors(true); //Supress Warnings for HTML5 conversion issue
$doc->loadHTML($output);
libxml_use_internal_errors(false); //Start Showing Errors

$xpath = new DOMXpath($doc);

foreach ($xpath->query('//h1') as $e) {
    $country = trim($e->textContent);

    foreach ($xpath->query('following-sibling::div[1]//h4', $e) as $h4) {
        $state = trim($h4->textContent);

        foreach ($xpath->query('following-sibling::ul[1]//li/a', $h4) as $a) {
                $town = $a->textContent;
                $attributeNodeMap = $a->attributes;
                $nodeAttribute = $attributeNodeMap->getNamedItem("href");
                $href = trim($nodeAttribute->nodeValue);

                echo "$country - $state - $town - $href<br>";
        }
    }
}
} } }
编辑

我就是这样做的。
首先,我将firefox与和一起使用(我想您可以在其他web浏览器中找到类似的工具)。
这个工具让我不用编写PHP代码就可以尝试一些Xpath

使用firebug,您可以看到DOM树,这对于了解您可以访问的内容非常有用,…然后使用firepath尝试Xpath

要开始,我在文档中选择了所有H1节点
//H1
,然后您需要为每个H1获取所有H4,以获取状态,但不幸的是H4节点不是H1节点的子节点,因此如果您想从H1开始,需要找到另一种方法来获取它rong>节点

如果查看DOM树,您将看到一个div(包含H4节点)是H1节点的下一个同级节点之一,因此让我们选择它
跟随同级节点::div[1]
(这是仅用于当前H1节点的div

我们需要所有H4节点
//H4
,然后我们有
以下同级节点::div[1]//H4

现在我们对每个H4
执行相同的操作,因此我们在所有LI节点中选择所有A节点,这些节点位于H4
的下一个同级UL
UL[1]//LI/A


我希望这是可以理解的(当然也是有用的),并且为错误感到抱歉,英语不是我的语言。

删除了我的评论,因为@Duccydake比我更有意义;)天哪,太棒了,谢谢duffydake。我以前试过使用下面的兄弟姐妹,但遇到了问题。我最初在上列出了它,因为它一直在城市中循环。缺少的部分是什么ul[1]部分。我甚至在原始帖子中插入了这一点,现在它开始工作了。你能再解释一下这一部分吗?我知道这应该是第一部分,但为什么需要它呢?你可以在谷歌中用$X(“”)在Consure中进行X路径查询,但不知道如何在其中使用太多的followsibling。是的
[1]
仅用于选择第一个,否则您将选择所有其他,我不知道为什么我不应该选择。