2009-10-14 24 views
10

Obtuve un artículo de Wikipedia y quiero buscar las primeras líneas z (o los primeros x caracteres, o las primeras palabras y, no importa) del artículo.Obtenga las primeras líneas de Wikipedia Artículo

El problema: puedo obtener el Wiki-Texto fuente (a través de API) o el HTML analizado (a través de HTTP-Request, eventualmente en la versión impresa) pero ¿cómo puedo encontrar las primeras líneas? Normalmente, la fuente (tanto html como wikitext) comienza con los cuadros de información e imágenes y el primer texto real que se muestra está en alguna parte del código.

Por ejemplo: Albert Einstein on Wikipedia (imprimir Versión). Mire en el código, la primera línea de texto real "Albert Einstein (pronunciado/ælbərt aɪnstaɪn /; alemán: [albɐt aɪ̯nʃtaɪ̯n]; 14 de marzo de 1879-18 de abril de 1955) fue un físico teórico". no está al principio. Lo mismo se aplica al Wiki-Source, comienza con el mismo cuadro de información y así sucesivamente.

Entonces, ¿cómo lograrías esta tarea? El lenguaje de programación es java, pero esto no debería importar.

Una solución que me vino a la mente fue utilizar una consulta xpath pero esta consulta sería bastante complicada para manejar todos los casos de frontera. [actualización] No fue tan complicado, ver mi solución a continuación! [/ actualización]

Gracias!

+0

"Pensamos que en vez de poblar una base de datos de información, el sistema acaba de recuperar los contenidos de una base de datos pública, la enciclopedia como Wikipedia" - http://www.fryan0911.com/2009 /05/how-to-retrieve-content-from-wikipedia.html –

+1

KMan: Eso solo recupera la fuente Wiki del artículo. El problema establecido por el PO aún se aplica. – Joey

Respuesta

0

trabajé a cabo la siguiente solución: El uso de un XPath-consulta en el XHTML-Fuente-Código (Tomé la versión impresa, ya que es más corto, pero también funciona en la versión normal).

//html/body//div[@id='bodyContent']/p[1] 

Esto funciona en alemán y en la Wikipedia en inglés y no he encontrado ningún artículo donde no aparezca el primer párrafo. La solución también es bastante rápida, también pensé en tomar solo los primeros x caracteres del xhtml, pero esto dejaría inválido el xhtml.

Si alguien está buscando la JAVA-Código aquí es entonces:

private static DocumentBuilderFactory dbf; 
static { 
    dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
} 
private static XPathFactory xpathf = XPathFactory.newInstance(); 
private static String xexpr = "//html/body//div[@id='bodyContent']/p[1]"; 


private static String getPlainSummary(String url) { 
    try { 
     // OPen Wikipage 
     URL u = new URL(url); 
     URLConnection uc = u.openConnection(); 
     uc.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1) Gecko/20090616 Firefox/3.5"); 
     InputStream uio = uc.getInputStream(); 
     InputSource src = new InputSource(uio); 

     //Construct Builder 
     DocumentBuilder builder = dbf.newDocumentBuilder(); 
     Document docXML = builder.parse(src); 

     //Apply XPath 
     XPath xpath = xpathf.newXPath(); 
     XPathExpression xpathe = xpath.compile(xexpr); 
     String s = xpathe.evaluate(docXML); 

     //Return Attribute 
     if (s.length() == 0) { 
      return null; 
     } else { 
      return s; 
     } 
    } 
    catch (IOException ioe) { 
     logger.error("Cant get XML", ioe); 
     return null; 
    } 
    catch (ParserConfigurationException pce) { 
     logger.error("Cant get DocumentBuilder", pce); 
     return null; 
    } 
    catch (SAXException se) { 
     logger.error("Cant parse XML", se); 
     return null; 
    } 
    catch (XPathExpressionException xpee) { 
     logger.error("Cant parse XPATH", xpee); 
     return null; 
    } 
} 

lo utilizan llamando getPlainSummary("http://de.wikipedia.org/wiki/Uma_Thurman");

0

Bueno, al usar la fuente Wiki en sí, podría quitar todas las plantillas al principio. Esto podría funcionar bastante bien para la mayoría de los artículos que tienen infoboxes o algunos mensajes en la parte superior.

Sin embargo, algunos artículos pueden poner el anuncio inicial en una plantilla, por lo que sería un poco difícil.

Otra forma, tal vez más confiable, sería tomar el contenido de la primera etiqueta <p> que aparece directamente en el texto del artículo (por lo tanto, no anidado en una tabla). Esto debería quitar las infoboxes y otras cosas al principio, ya que probablemente sean (no estoy del todo seguro) <table> o <div> s.

En general, Wikipedia está escrito para el consumo humano con un soporte muy mínimo para cualquier cosa semántica. Eso hace que la extracción automática de información específica de los artículos sea bastante dolorosa.

1

Necesita un analizador que pueda leer el marcado de Wikipedia. Pruebe WikiText o los analizadores que vienen con XWiki.

Eso le permitirá ignorar cualquier cosa que no quiera (titulares, tablas).

0

Como espera, probablemente tendrá que terminar analizando el código fuente, el código HTML compilado o ambos. Sin embargo, el Wikipedia:Lead_section puede darle alguna indicación de qué esperar en artículos bien escritos.

3

También estaba en la misma necesidad y escribí un código de Python para hacer eso.

El script descarga el artículo de wikipedia con el nombre de pila, lo analiza usando BeautifulSoup y devuelve los primeros párrafos.

El código está en http://github.com/anandology/sandbox/blob/master/wikisnip/wikisnip.py.

+0

Una solución maravillosamente pragmática, pero tenga en cuenta que esta solución depende de cómo el marcado wiki se transforma en HTML. Si puedes, te sugiero que analices el marcado de wiki directamente. – gnud

+0

Lo intenté. Pero resultó ser muy difícil porque el marcado contiene llamadas de función de la forma '{{...}}'. Por ejemplo, '{{convert | 1.2 | km | mi | spell = us}}'. Aquí está mi intento: http://github.com/anandology/sandbox/blob/master/wikipedia/wikitext.py –

1

Abrí el artículo de Albert Einstein en Firefox e hice clic en Ver fuente. Es bastante fácil de analizar utilizando un analizador HTML. Debería centrarse en el <p> y quitar el otro html de allí.

2

Wikipedia ofrece un Resúmenes download. Si bien este es un archivo bastante grande (actualmente 2.5GB), ofrece exactamente la información que desea para todos los artículos.

1

Por ejemplo, si usted tiene el resultado de una serie se encontraría el texto:

<div id="bodyContent"> 

y después de que el índice se encontraría el primer

<p> 

que sería el índice de el primer párrafo que mencionaste

probar este url Link to the content (just works in the browser)

+0

Gracias por la respuesta, esto me lleva a mi solución anterior (seleccionando el primer párrafo del cuerpoContenido- div. – theomega

8

Usted no necesita.

El parámetro exintro de la API devuelve solo la primera sección (cero) del artículo.

Ejemplo:api.php?action=query&prop=extracts&exintro&explaintext&titles=Albert%20Einstein

hay otros parámetros, también:

  • exchars Longitud de extractos en caracteres.
  • exsentences Número de oraciones para regresar.
  • exintro Vuelta solamente en la sección siguiente.
  • exsectionformat ¿Qué formato de encabezamiento de usar para los extractos de texto plano:

    wiki — e.g., == Wikitext == 
    plain — no special decoration 
    raw — this extension's internal representation 
    
  • exlimit número máximo de extractos para regresar.Debido a que la generación de extractos puede ser lenta, el límite está limitado a 20 para los extractos de introducción solamente y 1 para los extractos de página completa.
  • explaintext Devuelve extractos de texto sin formato.
  • excontinue Cuando haya más resultados disponibles, use este parámetro para continuar.

Fuente: https://www.mediawiki.org/wiki/Extension:MobileFrontend#prop.3Dextracts

Cuestiones relacionadas