为什么我的 for 循环只抓取第一个元素?

胡拉库拉

我正在使用 PHP 从网站获取数据,并尝试从该数据创建模型。这是我当前的代码:

$dom = new DOMDocument();
$html = file_get_contents('https://www.baseball-reference.com/register/team.cgi?id=41270199');
libxml_use_internal_errors(true);
$dom->loadHTML($html);
$table = $dom->getElementByID('team_batting');
$rows = $table->getElementsByTagName("tr");

for($i = 0; $i < $rows->length; $i++) {

    $stats = $table->getElementsByTagName("td");

    $name = $stats->item($i)->getAttribute('player');
    $age = $stats->item($i)->getAttribute('age');
    $plateAppearances = $stats->item($i)->getAttribute('PA');
    $atBats = $stats->item($i)->getAttribute('AB');
    $hits = $stats->item($i)->getAttribute('H');
    $doubles = $stats->item($i)->getAttribute('2B');
    $triples = $stats->item($i)->getAttribute('3B');
    $homeruns = $stats->item($i)->getAttribute('HR');
    $walks = $stats->item($i)->getAttribute('BB');
    $strikeouts = $stats->item($i)->getAttribute('SO');

    $name = $stats->item(0)->textContent;
    $age = $stats->item(1)->textContent;
    $plateAppearances = $stats->item(3)->textContent;
    $atBats = $stats->item(4)->textContent;
    $hits = $stats->item(6)->textContent;
    $doubles = $stats->item(7)->textContent;
    $triples = $stats->item(8)->textContent;
    $homeruns = $stats->item(9)->textContent;
    $walks = $stats->item(13)->textContent;
    $strikeouts = $stats->item(14)->textContent;

    $player = new Player([
        'name' => $name, 
        'age' => $age, 
        'plateAppearances' => $plateAppearances,
        'atBats' => $atBats,
        'hits' => $hits,
        'doubles' => $doubles,
        'triples' => $triples,
        'homeruns' => $homeruns,
        'walks' => $walks,
        'strikeouts' => $strikeouts
    ]);

    echo $player;
    echo '<br>';

}

这将检索我想要的所有属性,但只产生第一个玩家的 19 个实例(总行数),如下所示:

{"name":"Miguel Amaya","age":"19","plateAppearances":"241","atBats":"212","hits":"61","doubles":"14","triples":"2","homeruns":"9","walks":"24","strikeouts":"53"}

为了检索表中的所有玩家而不仅仅是第一个,我可以更改什么,并player为每个人创建一个模型?

编辑/更新:添加了一些我从中提取数据的表

<tr ><th scope="row" class="right " data-stat="ranker" >1</th><td class="left " data-append-csv="player.fcgi?id=amaya-000mig" data-stat="player" csk="Amaya,Miguel" ><a href="/register/player.fcgi?id=amaya-000mig">Miguel Amaya</a></td><td class="right " data-stat="age" >19</td><td class="right " data-stat="G" >59</td><td class="right " data-stat="PA" >241</td><td class="right " data-stat="AB" >212</td><td class="right " data-stat="R" >29</td><td class="right " data-stat="H" >61</td><td class="right " data-stat="2B" >14</td><td class="right " data-stat="3B" >2</td><td class="right " data-stat="HR" >9</td><td class="right " data-stat="RBI" >33</td><td class="right " data-stat="SB" >0</td><td class="right " data-stat="CS" >0</td><td class="right " data-stat="BB" >24</td><td class="right " data-stat="SO" >53</td><td class="right " data-stat="batting_avg" >.288</td><td class="right " data-stat="onbase_perc" >.365</td><td class="right " data-stat="slugging_perc" >.500</td><td class="right " data-stat="onbase_plus_slugging" >.865</td><td class="right " data-stat="TB" >106</td><td class="right " data-stat="GIDP" >3</td><td class="right " data-stat="HBP" >3</td><td class="right " data-stat="SH" >0</td><td class="right " data-stat="SF" >2</td><td class="right " data-stat="IBB" >2</td><td class="right " data-stat="notes" ></td></tr>
巴马

问题是$stats没有<td>从循环的当前行获取元素。你将它设置为所有<td>表中的元素。改变

$stats = $table->getElementsByTagName("td");

至:

$stats = $rows[$i]->getElementsByTagName("td");

然后摆脱所有使用items($i). $i是中的索引$rows,与 无关$stats

此外,您需要跳过表中的标题行,它没有任何<td>元素。使用它只获取 中的行<tbody>,跳过<thead>

$rows = $table->getElementsByTagName("tbody")->item(0)->getElementsByTagName("tr");

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的 Javascript 循环只返回第一个值?

为什么我的 for 循环只打印第一个结果?

为什么我的 for 循环只重复打印第一个 if 语句?

为什么我的for循环仅在第一个元素上起作用?

为什么变量只传递jQuery中for循环的第一个值?

为什么只在第一个元素上显示双引号?

为什么jQuery .find()只返回第一个元素?

SQL INSERT 为什么它只添加数组中的第一个元素?

为什么网格单元格只包含div的第一个元素?

为什么我只处理第一个变量?

为什么只打印我的 DataSource 的第一个对象?

为什么我在 Python 中的递归骑士代码只运行第一个堆栈?

为什么我的代码只复制第一个零而不复制其他的?

Firebase:为什么我的代码只使用集合中的第一个文档?

为什么for循环会更改for循环中的列表后跳过第一个元素?

我写了一个if / elseif语句,但是它只给我第一个答案,为什么?

为什么我的 jQuery show() 函数在 php foreach 循环中仅适用于第一个元素

为什么我的程序在For循环的第一个循环后跳过cin>>?

Selenium / Python:为什么在我的for循环迭代中找到第一个元素后,为什么Selenium find_element_不再通过查找元素了?

为什么我的代码只比较数组的第一个和最后一个数字 - Java

程序为什么在循环链接列表中的第一个元素之后插入节点?

为什么这个java迭代器循环也打印第一个元素?

我的循环只检查第一个数组项

为什么我在每个循环中只添加最后一个元素?

为什么在第一个foreach循环后我的变量数据丢失了?

遍历 for 循环:为什么我的第一个 if 语句不运行?

为什么第一个是无限循环?

我可以只检查第一个元素吗

Unmarshal只给了我嵌套在JSON响应中的数组的第一个元素