J'ai écrit un semoir de base de données l'année dernière qui gratte un site Web de statistiques. En revisitant mon code, il ne semble plus fonctionner et je suis un peu perplexe quant à la raison. $html->find()
est censé renvoyer un tableau d'éléments trouvés, mais il semble que ce soit seulement en trouvant la première table lorsqu'il est utilisé.Trouver des tables par ID en utilisant simple HTML DOM Analyseur
Conformément à la documentation, j'ai plutôt essayé d'utiliser find() et en spécifiant l'ID de chaque table, mais cela semble également échouer.
$table_passing = $html->find('table[id=passing]');
Quelqu'un peut-il m'aider à comprendre ce qui ne va pas ici? Je n'arrive pas à comprendre pourquoi aucune de ces méthodes ne fonctionne, où la source de la page affiche clairement plusieurs tables et les ID, où les deux approches devraient fonctionner.
private function getTeamStats()
{
$url = 'http://www.pro-football-reference.com/years/2016/opp.htm';
$html = file_get_html($url);
$tables = $html->find('table');
$table_defense = $tables[0];
$table_passing = $tables[1];
$table_rushing = $tables[2];
//$table_passing = $html->find('table[id=passing]');
$teams = array();
# OVERALL DEFENSIVE STATISTICS #
foreach ($table_defense->find('tr') as $row)
{
$stats = $row->find('td');
// Ignore the lines that don't have ranks, these aren't teams
if (isset($stats[0]) && !empty($stats[0]->plaintext))
{
$name = $stats[1]->plaintext;
$rank = $stats[0]->plaintext;
$games = $stats[2]->plaintext;
$yards = $stats[4]->plaintext;
// Calculate the Yards Allowed per Game by dividing Total/Games
$tydag = $yards/$games;
$teams[$name]['rank'] = $rank;
$teams[$name]['games'] = $games;
$teams[$name]['tydag'] = $tydag;
}
}
# PASSING DEFENSIVE STATISTICS #
foreach ($table_passing->find('tr') as $row)
{
$stats = $row->find('td');
// Ignore the lines that don't have ranks, these aren't teams
if (isset($stats[0]) && !empty($stats[0]->plaintext))
{
$name = $stats[1]->plaintext;
$pass_rank = $stats[0]->plaintext;
$pass_yards = $stats[14]->plaintext;
$teams[$name]['pass_rank'] = $pass_rank;
$teams[$name]['paydag'] = $pass_yards;
}
}
# RUSHING DEFENSIVE STATISTICS #
foreach ($table_rushing->find('tr') as $row)
{
$stats = $row->find('td');
// Ignore the lines that don't have ranks, these aren't teams
if (isset($stats[0]) && !empty($stats[0]->plaintext))
{
$name = $stats[1]->plaintext;
$rush_rank = $stats[0]->plaintext;
$rush_yards = $stats[7]->plaintext;
$teams[$name]['rush_rank'] = $rush_rank;
$teams[$name]['ruydag'] = $rush_yards;
}
}
Nous vous remercions de l'information. Malheureusement, j'ai essayé cela sans succès, où il retourne toujours un tableau vide. La documentation Simple HTML Dom Parser (bien que peu fournie) montre exactement comme vu dans mon code, pourquoi je suis si confus quant aux deux méthodes échouant. –
Je pense que je vois le problème: la table que vous essayez de trouver est dans les commentaires html – RamRaider
J'ai complètement manqué qu'ils ont été commentés, merci beaucoup! –