4 votes

Intégrer une section de HTML d'un autre site ?

Existe-t-il un moyen d'intégrer seulement une section d'un site web dans une autre page HTML ?

Exemple : Je vois une réponse sur laquelle je veux écrire un blog, alors je récupère le contenu HTML, je l'insère quelque part, et je ne montre que cela, stylisé comme sur stackoverflow. En fait, je veux citer en bloc la section de la page avec le style original, si cela a un sens. Est-ce quelque chose que le site lui-même doit fournir, ou puis-je utiliser un iframe et lui dire de ne montrer qu'un certain élément ou quelque chose de fou ? Je suis ouvert à toutes les options, mais je veux qu'il s'affiche en HTML, pas en image (c'est vraiment un dernier recours).

Si cela est possible, y a-t-il des problèmes de sécurité dont je dois être conscient ?

7voto

Eugene Katz Points 2784

Je ne pense pas que l'image doive vraiment être le dernier recours. Vous n'avez aucun contrôle sur le HTML/CSS de la page source, donc même si vous trouvez une solution (probablement en utilisant JavaScript pour extraire l'extrait désiré), il n'y a aucune garantie que demain le site ne décide pas de changer sa mise en page.

Même Jeff, qui a le contrôle de la mise en page de stackoverflow.com, préfère encore capture d'écran le site, plutôt que d'en extraire le contenu en direct.

Si votre objectif était de mettre le contenu à jour automatiquement, ce serait une autre histoire. Mais tout de même, à moins que vous n'utilisiez une méthode convenue de partage du contenu, comme le RSS, votre solution serait très fragile.

2voto

Russell Leggett Points 4562

Le concept que vous décrivez correspond à peu près à ce que l'on appelle une "inclusion violette" ou "transclusions". Il existe une bibliothèque pour cela, mais elle n'est pas vraiment développée activement. En voici quelques-unes ajaxian articles sur elle.

1voto

EoghanM Points 4383

Je recommande d'utiliser une solution côté serveur avec Python ; en utilisant urllib2 pour demander la page, puis en utilisant BelleSoupe pour extraire la partie dont vous avez besoin. BeautifulSoup dispose d'une interface de sélection très souple qui vous permet de créer des heuristiques pour la section qui vous intéresse.

Pour illustrer :

soup = BeautifulSoup(html)
text = soup.find(text="Some text on the page that is unlikely to change")
print soup.parent.prettify()

Ainsi, si le webmaster modifie ultérieurement le balisage de la page, votre script de scraping devrait toujours fonctionner.

1voto

porneL Points 42805

Du côté client <iframe> est la seule option pratique. Il est possible de le faire défiler, mais cela pourrait ne pas fonctionner à long terme, car il s'agit techniquement d'une attaque de type clickjacking.

Il existe également le XHR intersite, mais il nécessite l'adhésion du site de destination et ne fonctionne aujourd'hui que dans quelques navigateurs récents.

Obtenir du HTML du côté serveur est facile (tout cadre web décent a la capacité de télécharger la page et d'analyser le HTML et vous pouvez utiliser XPath/XSLT ou DOM pour extraire le bit que vous voulez).

L'obtention de styles sera toutefois délicate - les règles CSS peuvent ne pas fonctionner avec un fragment HTML sorti de son contexte. Vous devrez analyser le CSS, extraire et transformer les règles ou utiliser le navigateur et lire les règles de style. currentStyle de chaque nœud.

Il est évident que vous devez fortement filtrer le HTML que vous extrayez pour éviter les XSS. C'est plus difficile qu'il n'y paraît.

Si vous n'avez pas besoin d'automatiser cela, un bon éditeur WYSIWYG HTML+CSS pourrait être capable d'extraire le fragment de contenu avec les styles.

0voto

Jeremy Sullivan Points 421

Cela ressemble à quelque chose pour lequel les Web Slices d'IE8 seraient parfaits. Cependant, elle n'est disponible que dans IE8, et le site d'origine doit être mis en œuvre pour que vous puissiez en profiter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X