2009-09-16 4 views
4

J'ai eu du mal à trouver un exemple de code C# (j'utilise C# Visual Studio 2008 Express) qui peut enregistrer par programme une page web entière (avec une URL) incluant les images et le formatage (par exemple CSS). L'intention est que lors d'une phase ultérieure, je l'expédie (je ne sais pas encore comment) afin qu'il puisse être consulté plus tard via un navigateur.Code C# pour enregistrer une page Web entière? (avec images/formatage)

Existe-t-il un exemple d'approche la plus simple (utilisant les méthodes .NET Framework) pour sauvegarder une page Web entière? Enregistrement en tant que page avec un sous-répertoire pour les images ou autrement. Fondamentalement la même chose que ce que vous obtenez avec les navigateurs lorsque vous dites "enregistrer la page Web entière".

+0

Voulez-vous le HTML, ou quelque chose de différent? –

+0

Si c'était moi, j'essaierais de trouver un moyen d'automatiser Internet Explorer ou Firefox pour faire un "enregistrer sous". –

+0

@Robert, pourquoi ne pas simplement exécuter "wget ​​URL" ou tel? http://gnuwin32.sourceforge.net/packages/wget.htm –

Répondre

1

A partir du code du projet: ZetaWebSpider

+0

merci - je vais jeter un oeil à cela - à un premier coup d'oeil il semble y avoir des pages de code! :) Je suppose qu'il n'existe aucune bibliothèque existante .NET qui saisit tout pour une page Web donnée (c'est-à-dire HTML, puis revient pour les images suivantes, CSS etc)? – Greg

6

La façon la plus simple est sans doute d'ajouter un WebBrowser Control à votre application et pointer vers la page que vous souhaitez enregistrer en utilisant la méthode Navigate().

Ensuite, lorsque le document est chargé, appelez le ShowSaveAsDialog method. L'utilisateur peut alors enregistrer la page en un seul fichier ou un fichier avec des images dans un sous-répertoire.

[Mise à jour]

Après avoir remarquai « programatically » dans votre question, l'approche ci-dessus n'est pas idéale car elle nécessite soit l'implication des utilisateurs ou plonger dans l'API Windows pour envoyer entrée à l'aide SendKeys ou similaire.

Il n'y a rien d'intégré au .NET Framework qui fait tout ce que vous demandez.

donc mon approche révisée serait:

  • Utilisez System.NET.HttpWebRequest pour obtenir le document HTML principal comme une chaîne ou d'un flux (facile).
  • Chargez ce dans un document HTMLAgilityPack où vous pouvez facilement interroger le document pour obtenir des listes de tous les éléments d'image, des liens de feuille de style, etc.
  • ensuite faire une demande Web distincte pour chacun de ces fichiers et les enregistrer dans un sous-répertoire .
  • Enfin mettre à jour tous les liens pertinents dans la page principale pour pointer vers les éléments dans le sous-répertoire.

En effet, vous implémenteriez un navigateur Web très simple. Vous pouvez rencontrer des problèmes avec les pages qui utilisent JavaScript pour modifier ou demander dynamiquement le contenu de la page, mais pour la plupart des pages, cela devrait donner des résultats acceptables.

+0

Presque là ...Maintenant, il suffit de faire un SendKeys pour remplir le nom du fichier et appuyez sur le bouton OK. Yuck. –

+0

+1 J'irais avec cette approche. Une chose que vous pouvez vouloir regarder est si vous voudriez l'enregistrer en tant que document de MHTML (MIME HTML). Vous aurez du travail supplémentaire, mais pas besoin de sous-répertoires. – Rohit

+0

merci pour le pointeur vers "HTMLAgilityPack" - Je vais creuser dans ce domaine. Il semble être une bibliothèque très utilisée - est-ce comme la norme de facto pour travailler avec HTML pour les développeurs .net? – Greg

0

Ce n'est certainement pas élégant, mais vous pouvez naviguer un System.Windows.Forms.WebBrowser à l'URL, puis appeler sa méthode ShowSaveAsDiagog() pour enregistrer la page.

+1

@Yoooder, essayez de lire d'autres réponses avant d'afficher une réponse identique à celle qui existe déjà! – Ash

+3

Je l'ai fait. J'ai eu le mien dans-les-travaux et vérifiais le nom de la méthode sur MSDN, n'a pas vu le vôtre jusqu'à ce que j'avais posté. – STW

Questions connexes