Analyser tableau html à l'aide de file_get_contents de tableau php
Je suis en train d'analyser le tableau ci ici dans un multi-dimensionnelle tableau php. Je suis en utilisant le code suivant, mais pour certains, la raison de son retour d'un tableau vide. Après une recherche sur le web, j'ai trouvé ce site qui est où j'ai eu le parseTable() fonction. En lisant les commentaires sur ce site, je vois que la fonction fonctionne parfaitement. Donc je suis en supposant qu'il existe quelque chose de mal avec la façon dont je reçois le code HTML de file_get_contents(). Toute réflexion sur ce que je fais mal?
<?php
$data = file_get_contents('http://flow935.com/playlist/flowhis.HTM');
function parseTable($html)
{
//Find the table
preg_match("/<table.*?>.*?<\/[\s]*table>/s", $html, $table_html);
//Get title for each row
preg_match_all("/<th.*?>(.*?)<\/[\s]*th>/", $table_html[0], $matches);
$row_headers = $matches[1];
//Iterate each row
preg_match_all("/<tr.*?>(.*?)<\/[\s]*tr>/s", $table_html[0], $matches);
$table = array();
foreach($matches[1] as $row_html)
{
preg_match_all("/<td.*?>(.*?)<\/[\s]*td>/", $row_html, $td_matches);
$row = array();
for($i=0; $i<count($td_matches[1]); $i++)
{
$td = strip_tags(html_entity_decode($td_matches[1][$i]));
$row[$row_headers[$i]] = $td;
}
if(count($row) > 0)
$table[] = $row;
}
return $table;
}
$output = parseTable($data);
print_r($output);
?>
Je veux que mon tableau de sortie à ressembler à quelque chose comme ceci:
1 --> 11:33AM --> DEV --> DANS L'OBSCURITÉ 2 --> 11:29AM --> LIL' WAYNE --> ELLE 3 --> 11:26AM --> KARDINAL OFFISHALL --> NUMBA 1 (MARÉE HAUTE)
-1 pour le manque d'effort. Isoler votre problème au lieu de l'affichage d'un énorme bloc de code et de demander aux gens de comprendre quel est le problème et de le corriger.
OriginalL'auteur Farhan Ahmad | 2011-11-27
Vous devez vous connecter pour publier un commentaire.
Ne pas trop vous restreindre l'analyse HTML avec les expressions régulières! Au lieu de cela, laissez un analyseur HTML à la bibliothèque de s'inquiéter à propos de la structure de la marge pour vous.
Je vous suggère de vérifier Simple HTML DOM (http://simplehtmldom.sourceforge.net/). C'est une bibliothèque spécialement écrit pour de l'aide dans la résolution de ce type de web scraping problèmes en PHP. Par l'utilisation d'une telle bibliothèque, vous pouvez écrire votre grattage en beaucoup moins de lignes de codes sans se soucier de la création de travail sur les expressions régulières.
Dans le principe, Simple HTML DOM vous venez d'écrire quelque chose comme:
Il peut ensuite être étendue à la capture de vos données dans un format, par exemple pour créer un éventail d'artistes et de titres correspondants:
Nous pouvons voir que ce code peut être (trivialement) a changé à reformater les données de toute autre manière ainsi.
Avez-vous découvrez exemple "Grattage de Slashdot!" de la simplehtmldom site? Aussi loin que je comprends bien la réponse à cette question.
Ok, j'ai ajouté un autre exemple, mais c'est aussi loin que j'irai. Je vais laisser le reste pour vous à la figure.
Oui j'ai tout compris. Merci pour l'exemple.
À l'aide de simplehtmldom au lieu de rexexps est amusant, n'est-ce pas? 🙂
OriginalL'auteur jsalonen
J'ai essayé simple_html_dom mais sur des fichiers plus volumineux et sur la répétition des appels à la fonction, je suis zend_mm_heap_corrupted sur php 5.3 (GAH). J'ai aussi essayé de preg_match_all (mais cela a été défaillante sur un fichier de plus grande taille (5000) lignes de html, ce qui n'était que d'environ 400 lignes de mon tableau HTML.
Je me sers de ce travail rapide et de ne pas cracher erreurs.
Ce code a bien fonctionné pour moi.
Exemple de code original est ici.
http://techgossipz.blogspot.co.nz/2010/02/how-to-parse-html-using-dom-with-php.html
vous devriez faire array_shift($tableau) parce que le premier élément sera [0] => array(0) { } vide. c'est parce que vous obtenez toutes les balises tr $lignes dont l'une avec th tags. Je vais proposer une modification.
Je suis à l'aide de DOM avec PHP 5.6.31, mais a constaté que le résultat de
$rows = $tables->item(0)->getElementsByTagName('tr')
ne contiennent pas de<td>
balises pour un prochain$cols = $row->getElementsByTagName('td')
. Une idée de pourquoi mon premier appel àgetElementsByTagName()
semble dépouiller les balises HTML?OriginalL'auteur John Ballinger