C#.net Utilisation HTMLDocument à partir de la Console?
Je suis en train d'utiliser System.Windows.Forms.HTMLDocument
dans une application console. Tout d'abord, est-ce même possible? Si oui, comment puis-je charger une page sur le web? J'ai essayé d'utiliser WebBrowser
, mais il me dit:
Exception Non Gérée:
Système.Le filetage.ThreadStateException:
Contrôle ActiveX '885
6f961-340a-11d0-a96b-00c04fd705a2'
ne peut pas être instanciée parce que le
actuel th lire n'est pas dans un
single-threaded apartment.
Il semble y avoir un manque sévère de tutoriels sur le HTMLDocument
objet (ou Google vient de tourner inutile de résultats).
Viens de découvrir mshtml.HTMLDocument.createDocumentFromUrl
, mais qui me lève
Exception Non Gérée:
Système.Moment de l'exécution.InteropServices.COMException
(0x80010105): T il jeta un serveur
exception à la règle. (Exception de HRESULT:
0x80010105 (RPC_E_SERVERF AULT))
Système.RuntimeType.ForwardCallToInvokeMember(String
nomdumembre, BindingFla gs drapeaux,
Objet cible, Int32[] aWrapperTypes,
MessageData& msgData) à
mshtml.HTMLDocumentClass.createDocumentFromUrl(String
bstrUrl, Chaîne bstr Options)
iget.Programme.Main(String[] args)
Ce que le diable? Tout ce que je veux est une liste de <a>
des étiquettes sur une page. Pourquoi est-ce si difficile?
Pour ceux qui sont curieux, voici la solution que j'ai trouvé, grâce à TrueWill:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using HtmlAgilityPack;
namespace iget
{
class Program
{
static void Main(string[] args)
{
WebClient wc = new WebClient();
HtmlDocument doc = new HtmlDocument();
doc.Load(wc.OpenRead("http://google.com"));
foreach(HtmlNode a in doc.DocumentNode.SelectNodes("//a[@href]"))
{
Console.WriteLine(a.Attributes["href"].Value);
}
}
}
}
OriginalL'auteur mpen | 2009-11-22
Vous devez vous connecter pour publier un commentaire.
Comme alternative, vous pouvez utiliser le logiciel gratuit Html Agility Pack de la bibliothèque. Capable d'analyser le code HTML et vous permet de faire des requêtes LINQ. J'ai utilisé une ancienne version d'un projet à la maison et il a très bien fonctionné.
EDIT: Vous pouvez également utiliser le client web ou WebRequest classes de téléchargement de la page web. Voir mon billet de blog sur Web grattage .NET. (Notez que je n'ai pas essayé cela dans une application console.)
Vous n'avez pas à utiliser LINQ - lorsque j'ai été en utilisant la bibliothèque de la fonctionnalité n'a pas été ajouté. Il était encore assez facile. Vous pouvez créer un XPathNavigator, appel Sélectionnez sur cette question et de passer dans un chemin XPath de la chaîne, puis itérer sur le résultat. SelectSingleNode est l'autre grande méthode que j'ai utilisé.
J'ai ajouté un peu de code à ma question. Fonctionne très bien dans une console 🙂
Merci! Votre code est très concis. D'un côté: Il n'est probablement pas pertinent dans votre programme, mais WebClient est IDisposable.
OriginalL'auteur TrueWill
Ajouter l'attribut [STAThread] à votre méthode Principale
Qui devrait résoudre le problème.
Je ne pense pas que cela résout le problème. J'ai créé un objet WebBrowser, et puis j'ai
Navigate
àgoogle.com
.. j'ai attaché unDocumentCompleted
gestionnaire d'événements donc je sais quand c'est fait, le chargement, mais elle n'obtient jamais tiré. En fait, le programme passe juste à l'achèvement presque immédiatement, ce qui me dit que ce n'est pas attendre que la page se charge. Je ne pense pas qu'il aime être seul thread.On dirait que vous auriez également besoin d'un message de la pompe. Voir stackoverflow.com/questions/764869/c-console-app-event-handling
Que des sons désagréables. Beaucoup trop de travail juste pour lire un HTML doc sur le web 🙂 Merci bien.
mshtml est certainement pas conçu pour la console. Cela fait longtemps déconseillé de l'utiliser dans des applications côté serveur pour les mêmes raisons. HTML agility pack est une excellente alternative pour l'analyse.
OriginalL'auteur chris.w.mclean
Si c'est le xhtml le charger dans un XDocument et d'analyser les balises d'ancrage, ou vous pouvez aussi le faire avec les RegEx, si tous vous avez besoin est le point d'ancrage des balises.
Pourquoi est-regex un hack? Assez facile à obtenir le hrefs trop. +Regex est rapide.
Quant à savoir pourquoi regex (dans ce cas) est un hack, voir codinghorror.com/blog/archives/001311.html
Assez bon. Thx
OriginalL'auteur Wil P