我已经搜索并查看了很多关于stackoverflow的示例,但仍然无法使其工作。
我想抓取一个网站以获取我的体育俱乐部的位置表。
我的问题是我无法从表中获取"tr"内容。一开始我使用REGEX,但后来我读到人们不推荐它,所以现在我使用XPath,但无法让它工作。
我要抓取的页面是:http://resultater.dai-sport.dk/tms/Turneringer-og-resultater/Pulje-Stilling.aspx?PuljeId=104
我现在的代码是:
$doc = new DOMDocument();
$doc->loadHTMLFile("http://resultater.dai-sport.dk/tms/Turneringer-og-resultater/Pulje-Stilling.aspx?PuljeId=104"); // or you could load from a string using loadHTML();
$xpath = new DOMXpath($doc);
$elements = $xpath->query("/table/thead/tbody/tr");
print_r($elements);
我得到的结果是: DOMNodeList 对象 ( [长度] => 0 )
我完全错了吗?
正如@PeeHaa注意到的那样,tbody
标签不在thead
标签内(在普通代码中)。但是,源代码中没有tbody
标签,则可以使用:
$elements = $xpath->query("//table/tr");
要从站点中提取数据,您可以使用以下内容:
$elements = $xpath->query("//table/tr[contains(@class,'sr')]");
$keys = array('nb', 'hold', 'k', 'v', 'u', 't', 'scoreA', 'scoreB', 'p');
foreach ($elements as $elt) {
$results[] = array_combine($keys,
preg_split('~^'s++|'s++$|'h*+'R's*+-?'s*+~', $elt->textContent, null, 1)
);
}
echo '<pre>' . print_r($results, true);
另一种方法是使用preg_match()
并描述textContent
的结构。第二个链接的示例:
$pattern = <<<'LOD'
~
(?<kampnr> [0-9]++ ) 's++
(?<dato> [0-9]{2}-[0-9]{2}-[0-9]{2} ) 's++
(?>
kl'. 's++
(?<kl> [0-9]{2}:[0-9]{2} ) 's++
)?
(?<hjemmehold> .+? ) 'h*+ 'R 's++
(?<udehold> .+? ) 'h*+ 'R 's++
(?<spillA> .+? ) 'h*+ 'R 's++
(?<spillB> .+? ) 'h*+ 'R 's++
(?>
(?<resultatA> [0-9]++ ) 's*+ - 's*+
(?<resultatB> [0-9]++ )
)?
~xu
LOD;
foreach ($elements as $elt) {
if (preg_match($pattern, $elt->textContent, $match)) {
foreach($match as $k=>$v) {
if (is_numeric($k)) unset($match[$k]);
}
$result[] = $match;
}
}
echo '<pre>' . print_r($result, true);