2010-10-18 21 views
10

Estoy tratando de recuperar algo de información de un sitio web pero no puedo encontrar una solución que me funcione. Cada código que leo en Internet genera al menos un error para mí.Html Agility Pack ayuda

Incluso el código de ejemplo en su página de inicio me genera errores.

Mi código:

  HtmlDocument doc = new HtmlDocument(); 
     doc.Load("https://www.flashback.org/u479804"); 
     foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"]) 
     { 
      HtmlAttribute att = link["href"]; 
      att.Value = FixLink(att); 
     } 
     doc.Save("file.htm"); 

genera el siguiente error:

'HtmlDocument' es una referencia ambigua entre 'System.Windows.Forms.HtmlDocument' y C 'HtmlAgilityPack.HtmlDocument': * \ Form1.cs

Editar: toda mi código se encuentra aquí: http://beta.yapaste.com/55

¡Toda la ayuda es muy apreciada!

+0

Como mencioné en mi respuesta a continuación, realmente no puedo decir lo que estás tratando de hacer. Si puede describir la tarea que está tratando de lograr con más detalle, intentaré ayudarlo a escribir una aplicación de muestra para lograrlo. – rtpHarry

+0

Creo que podría usar "HtmlAgilityPack.HtmlDocument" en lugar de "HtmlDocument" para cerrar el compilador. –

+0

Ah, fue el "uso de HtmlDocument = System.Windows.Forms.HtmlDocument;" que de alguna manera "mágicamente" se agregó a mi cláusula usings, que estaba oscureciendo la versión HtmlAgilityPack de la clase HtmlDocument. –

Respuesta

9

Uso HtmlAgilityPack.HtmlDocument:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 

El compilador se está confundido porque dos de los espacios de nombres que ha importado con using contienen clases llamadas HtmlDocument - el espacio de nombres HTML agilidad paquete, y el espacio de nombres de Windows Forms. Puede evitar esto especificando qué clase quiere usar explícitamente.

+0

Luego aparece otro error: 'HtmlAgilityPack.HtmlDocument' no contiene una definición para 'DocumentElement' y no se puede encontrar ningún método de extensión 'DocumentElement' que acepte un primer argumento de tipo 'HtmlAgilityPack.HtmlDocument' (¿falta una directiva using? o una referencia de ensamblado?) –

+0

@Victor: no estoy seguro del diseño exacto de la biblioteca, pero sí veo el código de ejemplo http://htmlagilitypack.codeplex.com/wikipage?title=Examples&referringTitle=Home. Desde el comentario justo en la parte inferior de esa página, es posible que desee probar 'DocumentNode' en lugar de' DocumentElement'. Aunque es un poco ambicioso ... –

+0

DocumentNode me da más errores que DocumentElement –

2

Las clases en los dos espacios de nombres System.Windows.Forms y HtmlAgilityPack son conflictivas. Use nombres de tipos totalmente calificados o use alias de espacio de nombres.

+0

Eso no me ayudó demasiado, ¿podrías evolucionar lo que debería hacer un poco más? –

1

He escrito un par de artículos que explican cómo usar HtmlAgilityPack. Es posible que sean de utilidad para empezar:

ADVERTENCIA (2012-06-08): Este enlace es un poco spam - poco fiables pop-under anuncios, no hay mucho contenido.

No sé si lo han solucionado ahora pero ese fragmento no solía funcionar en la página de inicio del sitio, creo que era de una versión anterior de la biblioteca. Además, el fragmento no define FixLink() por lo que no funcionaría aunque fuera correcto para la biblioteca.

Recomendaría obtener la versión beta más reciente de la biblioteca porque tiene extensiones adicionales para realizar consultas de linq contra ella, lo que puede evitar confundir consultas xpath más adelante.

no he visto que se usa en una aplicación Windows Forms antes, pero parece que tendrá que utilizar nombres de tipo totalmente calificados como:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 

En cuanto a la tarea real que está intentando realizar , parece que quieres tomar una URL, insertar un nombre de usuario y una identificación en ella y luego ... ¿no estás seguro? ¿Parece que ambos están tratando de guardar el archivo en el disco y configurar el código html en el contenido de un formulario que no creo que puedan hacer?

+0

@tomfanning - gracias por la notificación, parece que uno de los widgets estaba enviando spam a los usuarios. He eliminado los widgets de PostRank y Blogged.com y ya no estoy viendo los spam pop unders. – rtpHarry

5

así es como lo logré. Tenga en cuenta que hay un error de código dado en el principal Html Agility Pack Example en foreach line doc.DocumentElement.SelectNodes ("// a [@href"]). El correcto y probado se da a continuación.

HtmlWeb hw = new HtmlWeb(); 

    HtmlDocument doc = hw.Load(@"http://tipscow.com"); 
    StringBuilder sb = new StringBuilder(); 

    List<string> lstHref = new List<string>(); 

    foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]").Distinct()) 
    { 
     string curHref = link.Attributes["href"].Value; 

     if(!lstHref.Contains(curHref)) 
     lstHref.Add(curHref); 

    } 
    foreach (string str in lstHref) 
    { 
     sb.Append(str +"<br />"); 
    } 

    Response.Write (sb.ToString()); 

Dado que funcionó para mí, pensé que debería compartir.

Cuestiones relacionadas