我尝试了许多xpath表达式,求值,循环等。 我得到的最好的是
的输出" } object(DOMNodeList)#3 (1) { ["length"]=> int(0) }
有人告诉我我做错了什么,使我摆脱了痛苦。
$doc = new DOMDocument;
libxml_use_internal_errors(true);
$doc->preserveWhiteSpace = false;
$doc->strictErrorChecking = false;
$doc->recover = true;
$text = urlencode('dog show');
$html = file_get_contents('https://en.wikipedia.org/w/index.php?search=' . $text . '&title=Special:Search&fulltext=Search');
$doc->loadHTML(htmlspecialchars($html));
var_dump($doc);
将所有内容带回来,那里没有问题-
现在,如何获取第一个搜索结果作为a href /wiki/Dog_show
的文本值以及嵌入节点列表中的title
或span值?
我尝试定位包含我正在寻找的内容的数据属性data-serp-pos="0"
$query = "//a/@href[data-serp-pos=\"0\"]";
$v = $xpath->evaluate($query);
var_dump($v);
我什至尝试进一步深入DOM树
// $query = '//*[@id="mw-content-text"]/div/ul/li[1]/div[1]/a';
// $query = '//*[@id="mw-content-text"]/div/ul/li[1]';
// $query = '//div[@id="mw-content-text"]//a/@href';
尝试循环
// $result = '';
// foreach ($xpath->evaluate($query) as $p) {
// $result .= $dom->saveHtml($p);
// }
// var_dump($result);
在评估中添加string
,->nodeValue
,->item(0)
等。
长度始终为0。
整个DIV html如下...
<div class="mw-search-result-heading"><a href="/wiki/Dog_show" title="Dog show" data-serp-pos="0"><span class="searchmatch">Dog</span><span class="searchmatch">show</span></a></div>
要获得href
值和关联的链接文本(或标题属性,在这种情况下是相同的),我没有做(可能很简单)的解决方案
答案 0 :(得分:1)
通常,我发现使用Chrome中的开发人员工具“检查”我希望定位的元素最容易,可以在其中复制针对该特定节点的XPath表达式。这并不总是返回最有用的XPath表达式,但这通常是一个很好的起点-在这种情况下,我调整了返回的查询并添加了类名。
希望有帮助
$term='dog show';
$url=sprintf('https://en.wikipedia.org/w/index.php?search=%s&title=Special:Search&fulltext=Search', urlencode( $term ) );
printf( '<a href="%s" target="_blank">%s</a>', $url, $url );
libxml_use_internal_errors(true);
$dom=new DOMDocument;
$dom->recover=true;
$dom->formatOutput=true;
$dom->preserveWhiteSpace=true;
$dom->strictErrorChecking=false;
$dom->loadHTMLFile( $url );
$xp=new DOMXPath( $dom );
/* possibly the important bit */
$query='//*[@id="mw-content-text"]/div/ul/li/div[@class="mw-search-result-heading"]/a';
$col=$xp->query( $query );
$html=array();
if( $col && $col->length > 0 ){
foreach( $col as $node ){
$html[]=array(
'title'=>$node->nodeValue,
'href'=>$node->getAttribute('href')
);
}
}
printf('<pre>%s</pre>',print_r($html,true));
将输出:
https://en.wikipedia.org/w/index.php?search=dog+show&title=Special:Search&fulltext=Search
Array(
[0] => Array
(
[title] => Dog show
[href] => /wiki/Dog_show
)
[1] => Array
(
[title] => Show dog
[href] => /wiki/Show_dog
)
[2] => Array
(
[title] => Westminster Kennel Club Dog Show
[href] => /wiki/Westminster_Kennel_Club_Dog_Show
)
[3] => Array
(
[title] => Dog Eat Dog (U.S. game show)
[href] => /wiki/Dog_Eat_Dog_(U.S._game_show)
)
.......... etc