2013-11-09 48 views
2

我有搜索,看了很多关于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)

我完全错了吗?

+3

您正在寻找'thead'中的'tbody'? – PeeHaa

+0

如果该页面上有多个表格,您可能还希望通过表格ID进行限制。 – halfer

回答

1

正如@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); 
+0

你好卡西米尔和Hippoolyte,我有更多的问题。也许你可以在那里帮忙:-)我也想抓取matchprogram - http://resultater.dai-sport.dk/tms/Turneringer-og-resultater/Pulje-Komplet-Kampprogram.aspx?PuljeId=104。但是当我用你提供给我的代码来完成它时,它只给了我第一个匹配,但是在其他代码中却失败了。如果我将preg_split函数中的参数1更改为0,它将给我所有其他人,但不是第一个: - /我想将它们全部取出? –

+1

@AndreasBaran:除preg_split以外的其他方法,请查看编辑。 preg_split函数中的1是选项的快捷方式:PREG_SPLIT_NO_EMPTY。 –