【问题标题】:Scrape specific <td> in HTML table在 HTML 表格中抓取特定的 <td>
【发布时间】:2016-02-17 15:46:35
【问题描述】:

我正在尝试使用 PHP 抓取一个表格,问题是我已经设法抓取它,但是我在网页的表格上得到了 everything。我不确定如何指定要抓取的 TD 和/或 TR。

这是 PHP 代码

<?php
include("simple_html_dom.php");
$html=file_get_html("http://www.premierleague.com/en-gb/matchday/league-table.html");
$html=new simple_html_dom($html);

foreach($html->find('table tr') as $row) {
$cell = $row->find('td', 0);
echo $row;
}
?>

我想要得到的(如果你查看the website)是: 俱乐部名称、出场、赢球、输球、进球数、失球数、净胜球数和积分。

我得到的是表格中的所有内容,包括折叠的团队信息。它看起来像这样(不确定图片是否是发布它的最佳方式,但我不确定如何以另一种方式显示它,我突出显示了我真正想要刮掉的部分):

【问题讨论】:

  • 是否有与表格行关联的特定 ID?
  • 是的,但是它们每个都有不同的名称,我想要的 类被命名为:club-row1,2,3,4,5,6 等,而 类被命名: col-club,col-p,col-d 等。如果这就是你的意思。

标签: php html html-table simple-html-dom scrape


【解决方案1】:

您是否尝试过查看Simple HTML DOM Parser 的高级用法?

我是根据上面链接中的手册编写的;它可能会让你朝着正确的方向前进:

require "simple_html_dom.php";

$html=file_get_html("http://www.premierleague.com/en-gb/matchday/league-table.html");
$html=new simple_html_dom($html);

$rows = array();
foreach($html->find('table.leagueTable tr.club-row') as $tr){
    $row = array();
    foreach($tr->find('td.col-club,td.col-p,td.col-w,td.col-l,td.col-gf,td.col-ga,td.col-gd,td.col-pts') as $td){
        $row[] = $td->innertext;
    }
    $rows[] = $row;
}
var_dump($rows);

本质上,您想要所有具有club-row 类的&lt;tr&gt; 元素(添加. 表示类);此外,您只需要嵌套在 &lt;table&gt; 中且类为 leagueTable 的行。这就是第一个发现正在做的事情。表格后面的空格表示您想要它的后代。

接下来,您需要 &lt;td&gt; 具有您提到的各种类的元素。您可以用逗号分隔这些以表示“和”。 (给我 td.col-club AND td.col-p AND...

foreach 循环只是遍历那些已解析的 DOM 元素并将它们的内部文本添加到数组中。之后你可以对他们做任何你想做的事。

【讨论】:

  • 感谢您的回答,对于简单的 HTML DOM 来说可能有点太新鲜了,无法理解这段代码,我会看看并尝试一下!
  • 刚刚看了下修改后的版本,也很好用!!非常感谢。
  • 我刚刚测试并更新了我的答案。看看并尝试一下!
  • 非常感谢,帮了大忙。
  • 正是我所需要的。谢谢!
【解决方案2】:

可能会围绕这个解决方案进行一些尝试,可能会为您带来结果。我已经尝试过上课,它正在获取一行的结果。检查它是否是您正在寻找的解决方案:

<?php
    $grab = file_get_contents("http://www.premierleague.com/en-gb/matchday/league-table.html");
    $first = explode( '<td class="col-sort">' , $grab );
    $second = explode("</td>" , $first[1] );
?>
<table style="width:80%">
  <tr>
    <td><?php echo $second["1"];?> (LP)</td>
    <td><?php echo $second["2"];?> (Club)</td>
    <td><?php echo $second["3"];?> (P)</td>
    <td><?php echo $second["4"];?> (W)</td>
    <td><?php echo $second["5"];?> (D)</td>
  </tr>
</table>

【讨论】:

  • 感谢朋友的回答!像魅力一样工作。
【解决方案3】:
$output = array();
foreach($html->find('table',0)->find('tr') as $row) {
$club = $row->find('.col-club', 0);
$p = $row->find('.col-p', 0);
$output[] = array("club" => $club->innertext , "p" => $p->innertext);
}
var_dump($output);

这就是我要做的

编辑:遍历部分:

foreach($output as $row)
{
foreach($row as $key => $value)
{ 
 echo $key ."|||" . $value ."</br>";
}
echo "</br>";
}

编辑: 忘记提取内文了~

【讨论】:

  • 感谢您的回答,有什么办法可以让我回显一下,看看它是什么样子的?
  • var_dump 部分会回显所有内容,在浏览器上右键显示源代码以查看格式化的输出还添加了如何遍历数组
  • 好的,我忘了实际提取内部文本,只是将整个对象放在数组上,现在这应该可以解决问题
  • 干杯伙伴,看看!
猜你喜欢
  • 1970-01-01
  • 2021-05-31
  • 2018-08-26
  • 2020-01-03
  • 1970-01-01
  • 2018-11-06
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多