2010-02-13 30 views
9

Estoy buscando una forma confiable de extraer texto dada la dirección web, en ASP.NET/C#. ¿Alguien puede señalarme la dirección correcta?Obtener texto de una URL en ASP.NET

Además, la dirección web podría ser un sitio de noticias que podría tener muchos anuncios y menús, etc. Necesito alguna forma inteligente de extraer solo el contenido relevante. No estoy seguro de cómo se podría hacer esto, ¿cómo definiría qué relevancia es?

¿Debo leer algo de un canal RSS? Tiene alguna idea sobre esto?

EDIT He añadido un bounty. Estoy buscando extraer texto "relevante" de una URL. De "relevante" quiero decir, debe excluir el texto de los anuncios (y otra información irrelevante). La entrada será similar a un sitio de noticias. Necesito extraer sólo la información de noticias y deshacerse del texto extraño

+1

HTML Agility Pack ayuda aquí? –

Respuesta

4

Una vez que haya descargado la página, y comenzó a usar una biblioteca como HTML agilidad paquete para analizar el HTML, entonces su trabajo comienza raspado :)

pantalla está dividido en dos partes.

Primero el webcrawler (mucha información sobre esto en la web, y un código simple provisto aquí con WebClient por algunas otras respuestas). El rastreador debe atravesar enlaces y descargar páginas. Si está descargando muchas páginas y tiene la url de inicio, puede hacer las suyas propias, o usar una existente. Consulte Wikipedia para obtener una lista de webcrawlers/spiders de código abierto.

La segunda parte es analizar el html y extraer solo el texto que desee, y omitir cualquier ruido (encabezados, pancartas, pies de página, etc.). El simple hecho de atravesar el DOM es fácil con las bibliotecas existentes, y descubrir qué hacer con lo que analiza es la parte más difícil.

He escrito un poco al respecto en otro SO question y podría darle algunas ideas sobre cómo obtener manualmente el contenido que desea. Según mi experiencia, no hay una forma 100% de encontrar el contenido principal de una página, y la mayoría de las veces es necesario que le proporcione algunas sugerencias. La parte difícil es que si el diseño html de la página cambia, entonces su raspador de pantalla comenzará a fallar.

Se podría aplicar estadísticas y comparar el código HTML de varias páginas con el fin de deducir donde los anuncios, menús, etc son, a fin de eliminar aquellos.

Ya que mencionas sitios de noticias, hay otros dos enfoques que deberían ser más fáciles de aplicar a estos sitios en comparación con el análisis cabo el texto del HTML original.

  1. Compruebe si la página tiene una url de impresión. P.ej. un enlace en CNN tiene una url de impresión equivalente que es mucho más fácil de analizar.
  2. Compruebe si la página tiene una representación RSS, y elija el texto del artículo de la fuente RSS en su lugar. Si el feed no tiene todo el contenido, debería darle suficiente texto para ubicar el texto en la página html completa.

Consulte también The Easy Way to Extract Useful Text from Arbitrary HTML para obtener información sobre cómo crear un analizador sintáctico más general. El código está en Python, pero debería poder convertirlo sin demasiados problemas.

-4

Una vez que tenga las páginas web de código html, baremo utilizar expresiones regulares

+1

Algo como "\ w +" –

+4

Analizar HTML con expresiones regulares es imposible. No malgastes tu tiempo. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

0

el fin de obtener el código HTML real, probar el cliente Web objeto. Algo como esto le dará el marcado:

System.Net.WebClient client = new System.Net.WebClient(); 

     // Add a user agent header in case the 
     // requested URI contains a query. 

     client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 

     Stream data = client.OpenRead ("http://www.google.com"); 
     StreamReader reader = new StreamReader (data); 
     string s = reader.ReadToEnd(); 
     //"s" now contains your entire html page source 
     data.Close(); 
     reader.Close(); 

Luego, como ISC-Fausto dijo, puede utilizar expresiones regulares para analizar la salida según sea necesario.

+0

Cualquier URL debe ser compatible con esta aplicación.Dado que las páginas web no siguen el mismo patrón, no estoy seguro de si es posible incluso que el analizador sea inteligente al eliminar datos "irrelevantes" – Nick

+2

Intentar utilizar expresiones regulares para analizar HTML puede ser realmente pesado y frustrante. Utilice el HTML Agility Pack si puede, es un analizador DOM, que es REALMENTE lo que necesita para extraer texto de HTML. –

+0

¿Dónde encaja el paquete de agilidad? Uso el código de Steve para tomar el HTML y ejecutarlo en el paquete para quitar las etiquetas html y el contenido irrelevante y obtener texto sin formato. ¿Hay métodos integrados en el paquete de agilidad para hacer esto? Gracias – Nick

3

Creo que se necesita un analizador HTML como HTMLAgilityPack o puede utilizar el bebé recién nacido .. YQL, es una nueva herramienta a desarrollar por Yahoo su sintaxis es como SQL y se necesita un poco de conocimiento de XPATH ...

http://developer.yahoo.com/yql/

Gracias

2

utilizar una instancia WebClient para obtener su margen de beneficio ...

Dim Markup As String 

Using Client As New WebClient() 
    Markup = Client.DownloadString("http://www.google.com") 
End Using 

Y luego use the HtmlAgilityPack para analizar la respuesta con XPath ...

Dim Doc As New HtmlDocument() 
Doc.LoadXML(Markup) 

If Doc.ParseErrors.Count = 0 Then 
    Dim Node As HtmlNode = Doc.DocumentNode.SelectSingleNode("//body"); 

    If Node IsNot Nothing Then 
     'Do something with Node 
    End If 
End If 
+0

Es bueno ver algunos VB aquí. Notaré, sin embargo, que hay una etiqueta C# en la pregunta. Es probable que obtenga más votos si proporcionó los dos. – Armstrongest

+0

@Atomiton http://codechanger.com –

0

Técnicas de resumen de texto son lo que probablemente desee. Pero como una heurística aproximada, puede hacer esto con algunos pasos relativamente simples, siempre y cuando no cuente con resultados 100% perfectos todo el tiempo.

Siempre que no necesite admitir sistemas de escritura que no tengan espacios entre las palabras (chino, japonés), puede obtener resultados bastante buenos buscando las primeras dos secuencias de secuencias de palabras consecutivas con un umbral arbitrario que pasará algunos días sintonizando. (Los chinos y japoneses requerirían un algoritmo razonable de identificación de salto de palabras además de esta heurística).

Comenzaría con un Analizador HTML (HTML Agility Pack en Dotnet, o algo así como Ruby's Nokogiri o Python's BeautifulSoup si desea experimentar con los algoritmos en un entorno más interactivo antes de comprometerse con su solución C#).

Para reducir el espacio de búsqueda, las secuencias de enlaces con poco o ningún texto que rodea el uso de las funciones de su analizador de HTML. Eso debería eliminar la mayoría de los paneles de navegación y ciertos tipos de anuncios. Puede extender esto para buscar enlaces que tengan palabras después pero sin puntuación; esto eliminaría los enlaces descriptivos.

Si usted comienza a ver carreras de texto seguido de "" o "," con, por ejemplo, 5 o más palabras (que puede intentar sintonizar más adelante), comenzaría a calificarlo como una oración potencial o un fragmento de oración. Cuando encuentras varias carreras seguidas, eso tiene buenas probabilidades de ser la parte más importante de la página. Podría anotar texto con <p> etiquetas a su alrededor un poco más alto. Una vez que tienes una buena cantidad de este tipo de secuencias, las probabilidades son bastante buenas de que tengas "contenido" en lugar de diseño de Chrome.

esto no va a ser perfecto, y es posible que tenga que añadir un mecanismo para ajustar la heurística basada en estructuras de página problemáticas que analice con regularidad. Pero si construyes algo basado en este enfoque, debería proporcionar resultados bastante razonables para el 80% de tu contenido.

Si encuentra este tipo de método inadecuado, es posible que desee ver en la probabilidad bayesiana o modelos ocultos de Markov como una forma de mejorar los resultados.

Cuestiones relacionadas