【问题标题】:Crawl website and get table data爬取网站并获取表格数据
【发布时间】:2013-11-09 18:11:38
【问题描述】:

我已经搜索并查看了很多关于 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 Object ( [length] => 0 )

我完全错了吗?

【问题讨论】:

  • 您正在寻找tbody 中的thead??
  • 您可能还想通过表 id 进行限制,以防该页面上有多个表。

标签: php regex xpath web-crawler


【解决方案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);

【讨论】:

  • 您好 Casimir et Hippoolyte,我还有一个问题。也许你也可以在那里提供帮助:-) 我也想爬取比赛程序 - resultater.dai-sport.dk/tms/Turneringer-og-resultater/…。但是,当我使用您提供给我的代码执行此操作时,它只给了我第一个匹配项,但在其他匹配项中失败了。如果我将 preg_split 函数中的参数 1 更改为 0,它会给我所有其他参数,但不是第一个:-/ 我想全部获取它们吗?
  • @AndreasBaran:除了 preg_split 之外的另一种方式,看看编辑。 preg_split 函数中的 1 是选项的快捷方式:PREG_SPLIT_NO_EMPTY。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2012-04-23
  • 2019-07-19
相关资源
最近更新 更多