2009-12-29 18 views
3

J'ai une liste de sites Web pour chaque membre du Congrès américain que je ramasse par programmation pour récupérer des adresses. La plupart des sites ont des balisages sous-jacents différents, mais ce n'était pas un problème au départ jusqu'à ce que je commence à voir que des centaines de sites ne donnaient pas les résultats attendus pour le script que j'avais écrit. Après avoir pris plus de temps pour évaluer les causes potentielles, j'ai trouvé qu'appeler strip_tags() sur les résultats de file_get_contents() effaçait la plupart de la source de la page plusieurs fois! Ce n'était pas seulement enlever le HTML, c'était enlever le non-HTML que je voulais gratter!Lorsque strip_tags() Burns a Haystack

J'ai donc retiré l'appel à strip_tags(), substitué un appel pour supprimer tous les caractères non alphanumériques et a donné au processus une autre exécution. Il a trouvé d'autres résultats, mais il manquait encore beaucoup. Cette fois, c'était parce que mes expressions régulières ne correspondaient pas aux motifs désirés. Après avoir regardé le code retourné, j'ai réalisé que j'avais les restes d'attributs HTML entremêlés dans le texte, brisant mes schémas.

Y a-t-il un moyen de contourner cela? Est-ce le résultat d'un HTML malformé? Puis-je faire quelque chose à ce sujet?

Répondre

5

Il y a un avertissement dans le manuel PHP qui lit:

Parce que strip_tags() ne fait pas valident le code HTML, partiel ou cassés balises peuvent entraîner la suppression de plus texte/données que attendu.

Étant donné que vous gravez de nombreux sites différents et que vous ne pouvez pas rendre compte de la validité de leur HTML, cela posera toujours un problème. Malheureusement, les expressions rationnelles ne vont pas le faire pour vous non plus, comme regexps simply aren't cut out to be document parsers.

Je voudrais utiliser quelque chose comme PHP Simple HTML DOM Parser, ou même la méthode intégrée DOMDocument->loadHTML().

Vous pourriez garder une petite base de données qui a enregistré chaque page que vous vouliez gratter, et où l'information a été trouvée dans la structure de cette page. Chaque fois que vous le racliez, vous pouviez vérifier rapidement si la structure avait changé, auquel cas vous pouviez mettre à jour votre base de données avec le nouvel emplacement du chemin de votre analyseur DOM et l'obtenir lors de l'éraflure suivante.

0

Le html mal formé peut très bien être la cause. Vous pouvez essayer de charger les pages via DOMDocument::loadhtmlfile(). Mai il est capable de "réparer" les erreurs.
Jetez aussi un coup d'œil à libxml_use_internal_errors() car cela pourrait vous aider à identifier et à gérer les problèmes.