PHP-在Xpath查询中进一步挖掘
我一直在尝试从这个视频学习如何使用Xpath类型的查询: 虽然我已经开始稍微了解所有内容,但我想进一步尝试使用嵌套循环提取代码来提取嵌套元素,然后对它们进行分类。我只是以craigslist为例,因为他们在视频中开始了它,并在他们的“站点”网页下列出了它 我不得不重写它,因为在它有一个无限循环之前。现在,如果有人知道一个更好的写作方法,我会喜欢输入,但这就是我所拥有的 我一直在尝试将结果转换成以下格式 国家/地区-州-城市名称文本-城市名称href 当然,cityNameHref=链接到城市 现在,我只是让它打印内部的结果,其中列出了实际的城市,因为craigslist的格式是PHP-在Xpath查询中进一步挖掘,php,xpath,Php,Xpath,我一直在尝试从这个视频学习如何使用Xpath类型的查询: 虽然我已经开始稍微了解所有内容,但我想进一步尝试使用嵌套循环提取代码来提取嵌套元素,然后对它们进行分类。我只是以craigslist为例,因为他们在视频中开始了它,并在他们的“站点”网页下列出了它 我不得不重写它,因为在它有一个无限循环之前。现在,如果有人知道一个更好的写作方法,我会喜欢输入,但这就是我所拥有的 我一直在尝试将结果转换成以下格式 国家/地区-州-城市名称文本-城市名称href 当然,cityNameHref=链接到城市 现
<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]
仅用于选择第一个,否则您将选择所有其他,我不知道为什么我不应该选择。