php xpath求值重复数据仅获取第一行
这是我的PHP代码:php xpath求值重复数据仅获取第一行,php,xpath,evaluate,Php,Xpath,Evaluate,这是我的PHP代码: <?php error_reporting(E_ALL); ini_set("display_errors",1); ini_set('max_execution_time', 36000); //300 seconds = 5 minutes $url = 'http://www.sportstats.com/soccer/matches/20170815/'; libxml_use_internal_errors(true); $doc = new DO
<?php
error_reporting(E_ALL);
ini_set("display_errors",1);
ini_set('max_execution_time', 36000); //300 seconds = 5 minutes
$url = 'http://www.sportstats.com/soccer/matches/20170815/';
libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTMLFile($url);
$xpath = new DOMXpath($doc);
$data = array(
'HomeTeam' => $xpath->evaluate('string(//td[@class="table-home"]/a)'),
'AwayTeam' => $xpath->evaluate('string(//td[contains(@class, "table-away")]/a)'),
'FtScore' => $xpath->evaluate('string(normalize-space(translate(//td[@class="result-neutral"]," " ,"")))'),
'HomeTeamid' => $xpath->evaluate('substring-before(substring-after(substring-after(//td[@class="table-home"]/a/@href, "/soccer/"),"-"),"/")'),
'AwayTeamid' => $xpath->evaluate('substring-before(substring-after(substring-after(//td[@class="table-away"]/a/@href, "/soccer/"),"-"),"/")')
);
foreach ($data as $key) {
echo $data['HomeTeamid'].",";
echo $data['HomeTeam'].",";
echo $data['FtScore'].",";
echo $data['AwayTeam'].",";
echo $data['AwayTeamid']."<br/>";
}
?>
但我希望它看起来像
HTeamid,Santos,0-0,Fluminense,ATeamid
HTeamid,Cartagena,1-0,Llaneros,ATeamid
HTeamid,Cerro Porteno,1-1,Libertad Asuncion,ATeamid
HTeamid,Operario,2-1,Maranhao,ATeamid
HTeamid,Emelec,2-0,Fuerza,ATeamid
...
..
.
我查看了网站上的其他问题,没有找到答案
如何使用echo命令获取所有其他团队的数据(我不想使用var_dump)。谢谢。尝试如下编辑xpath数组:
'HomeTeam' => $xpath->query('//td[@class="table-home"]/a'),
'AwayTeam' => $xpath->query('//td[contains(@class, "table-away")]/a'),
'FtScore' => $xpath->query('//td[@class="result-neutral"]'),
...
foreach ($data as $dataKey => $dataValue) {
foreach ($dataValue as $key => $element) {
$nodes = $element->childNodes;
foreach ($nodes as $node) {
$tag = $node->nodeValue;
echo $dataKey.' - '.$key.' - '.$tag.'<br>'; //$dataKey and $key are just informative
}
}
echo '<br>';
}
使用查询
并更改路径
然后你可以像这样回应你的结果:
'HomeTeam' => $xpath->query('//td[@class="table-home"]/a'),
'AwayTeam' => $xpath->query('//td[contains(@class, "table-away")]/a'),
'FtScore' => $xpath->query('//td[@class="result-neutral"]'),
...
foreach ($data as $dataKey => $dataValue) {
foreach ($dataValue as $key => $element) {
$nodes = $element->childNodes;
foreach ($nodes as $node) {
$tag = $node->nodeValue;
echo $dataKey.' - '.$key.' - '.$tag.'<br>'; //$dataKey and $key are just informative
}
}
echo '<br>';
}
当然,如果你想要一些有意义的数据打印,你需要它收集在数组中
希望这就是你想要的答案:)
祝您愉快!这里有两个错误,您在位置路径中使用了
/td
。这使得相对于文档的路径和字符串函数总是返回列表中第一个节点的文本内容。您总是得到第一个游戏
获取列表数据的典型结构是:
foreach($xpath->evaluate($exprForItems) as $item) {
$detail = $xpath->evaluate($exprForDetail, $item);
}
一个更具体的例子:
$document = new DOMDocument();
$document->loadHtml($html);
$xpath = new DOMXpath($document);
$expressions = new stdClass();
// this is the expression for items - it returns a node list
$expressions->games = '//div[@id = "LS_todayMatchesContent"]/table/tbody/tr';
// this are detail expressions - they return a string
$expressions->home = 'string(td[@class = "table-home"]/a)';
$expressions->homeId = 'substring-before(substring-after(substring-after(td[@class="table-home"]/a/@href, "/soccer/"),"-"),"/")';
$expressions->away= 'string(td[@class = "table-away"]/a)';
foreach ($xpath->evaluate($expressions->games) as $game) {
var_dump(
[
$xpath->evaluate($expressions->home, $game),
$xpath->evaluate($expressions->homeId, $game),
$xpath->evaluate($expressions->away, $game)
]
);
}
输出:
array(3) {
[0]=>
string(6) "Santos"
[1]=>
string(8) "n3QdnjFB"
[2]=>
string(10) "Fluminense"
}
array(3) {
[0]=>
string(9) "Cartagena"
[1]=>
string(8) "6eofBSjQ"
[2]=>
string(8) "Llaneros"
}
//...
因此,只有细节表达式使用字符串函数,并且它们始终需要项节点作为上下文(第二个参数)。使用上下文时必须小心。您还可以向我们显示预期结果吗?[网站上的匹配列表][1][1]:您有什么建议吗?我不懂PHP,所以我无法帮助这不是我想要的。xpath查询不支持字符串、前后子字符串函数。您不能使用xpath查询实现这一功能。我知道,必须对hometeamid和awayteamid使用xpath evaluate…谢谢。祝您愉快。
DOMXpath::query()
是DOMXpath::evaluate()的一个有限变量。
给定相同的表达式,evaluate()将返回相同的节点列表。如何处理此问题?是否有解决方案?空屏幕。我没有得到任何结果。它不一定是?$html=file\u get\u contents(');警告:DOMDocument::loadHTML():ID todayMatches_0已在实体中定义,第:133行。这不是Xpath逻辑的一部分,而是HTML加载。您需要像在问题中一样捕获/隐藏错误。是的,HTML已损坏,它具有重复的ID属性。好的,我会尽我所能。我不再让您忙了。非常感谢。