2009-10-14 18 views
10

Ho un articolo di Wikipedia e voglio recuperare le prime linee z (o i primi x caratteri, o le prime parole y, non importa) dall'articolo.Ottieni le prime righe di Wikipedia Articolo

Il problema: posso ottenere sia la fonte Wiki-Text (tramite API) o HTML analizzata (via HTTP di richiesta diretta, eventualmente dal print-versione), ma come posso trovare le prime righe visualizzate? Normalmente la fonte (sia html che wikitext) inizia con le informazioni-box e le immagini e il primo vero testo da visualizzare è da qualche parte nel codice.

Ad esempio: Albert Einstein on Wikipedia (versione di stampa). Cerca nel codice, la prima riga di testo reale "Albert Einstein (pronunciato/ælbərt aɪnstaɪn /; tedesco: [albɐt aɪ̯nʃtaɪ̯n]; 14 marzo 1879-18 aprile 1955) era un fisico teorico." non è all'inizio. Lo stesso vale per lo Wiki-Source, inizia con la stessa info-box e così via.

Quindi, come realizzeresti questo compito? Il linguaggio di programmazione è java, ma questo non dovrebbe importare.

Una soluzione che mi è venuta in mente era utilizzare una query xpath ma questa query sarebbe piuttosto complicata per gestire tutti i casi limite. [aggiornamento] Non è stato così complicato, vedi la mia soluzione qui sotto! [/ update]

Grazie!

+0

"Abbiamo pensato che invece di compilazione di un database di informazioni, il sistema sarà solo recuperare il contenuto da un database un'enciclopedia pubblico, come Wikipedia" - http://www.fryan0911.com/2009 /05/how-to-retrieve-content-from-wikipedia.html –

+1

KMan: Questo richiama solo la fonte Wiki dell'articolo. Il problema indicato dall'OP si applica ancora. – Joey

risposta

0

ho lavorato fuori la seguente soluzione: Utilizzando un xpath-query sul XHTML-Source-Code (ho preso la stampa versione perché è più breve, ma anche funziona sulla versione normale).

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

Questo funziona su tedesco e su Wikipedia in inglese e non ho trovato un articolo in cui non è così uscita al primo comma. La soluzione è anche abbastanza veloce, ho anche pensato di prendere solo i primi x caratteri del xhtml, ma questo renderebbe il xhtml non valido.

Se qualcuno è alla ricerca per il JAVA-Code qui è quindi:

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 usano chiamando getPlainSummary("http://de.wikipedia.org/wiki/Uma_Thurman");

0

Bene, quando si utilizza la fonte Wiki stessa è possibile semplicemente rimuovere tutti i modelli all'inizio. Questo potrebbe funzionare abbastanza bene per la maggior parte degli articoli che hanno infobox o alcuni messaggi nella parte superiore.

Tuttavia, alcuni articoli potrebbero inserire il modello iniziale in un modello stesso, quindi sarebbe un po 'difficile.

Un altro modo, forse più affidabile, sarebbe quello di prendere il contenuto del primo tag <p> che appare direttamente nel testo dell'articolo (quindi non annidato in una tabella o giù di lì). Questo dovrebbe spogliare infoboxes e altre cose all'inizio come quelle sono probabilmente (non sono esattamente sicuro) <table> s o <div> s.

Generalmente, Wikipedia è scritto per il consumo umano con un supporto minimo per qualsiasi cosa semantica. Ciò rende piuttosto doloroso l'estrazione automatica di informazioni specifiche dagli articoli.

1

È necessario un parser in grado di leggere il markup di Wikipedia. Prova a WikiText o al parser fornito con XWiki.

Ciò consente di ignorare tutto ciò che non si desidera (titoli, tabelle).

0

Come previsto, sarà probabilmente necessario analizzare l'origine, l'HTML compilato o entrambi. Tuttavia, lo Wikipedia:Lead_section potrebbe darti qualche indicazione su cosa aspettarti da articoli ben scritti.

3

Anche io avevo lo stesso bisogno e ho scritto del codice Python per farlo.

Lo script scarica l'articolo di wikipedia con il nome specificato, lo analizza utilizzando BeautifulSoup e restituisce i primi paragrafi.

Il codice è http://github.com/anandology/sandbox/blob/master/wikisnip/wikisnip.py.

+0

Una soluzione meravigliosamente pragmatica, ma si noti che questa soluzione dipende da come il markup wiki viene trasformato in HTML. Se puoi, ti suggerirei di analizzare direttamente la marcatura wiki. – gnud

+0

Ho provato. Ma si è rivelato molto difficile perché il markup contiene chiamate di funzione della forma '{{...}}'. Ad esempio, '{{convert | 1.2 | km | mi | spell = us}}'. Ecco il mio tentativo: http://github.com/anandology/sandbox/blob/master/wikipedia/wikitext.py –

1

Ho aperto l'articolo di Albert Einstein in Firefox e ho fatto clic su Visualizza sorgente. È abbastanza semplice analizzare utilizzando un parser HTML. Dovresti concentrarti sullo <p> e rimuovere l'altro html dal suo interno.

2

Wikipedia offre un abstract download. Mentre questo è un file piuttosto grande (attualmente 2.5GB), offre esattamente le informazioni che desideri, per tutti gli articoli.

1

Per esempio, se si ha il risultato di una serie si dovrebbe trovare il testo:

<div id="bodyContent"> 

e dopo che l'indice si dovrebbe trovare la prima

<p> 

che sarebbe l'indice di il primo paragrafo che hai menzionato.

provare questo URL Link to the content (just works in the browser)

+0

Grazie per la risposta, questo mi portano nella mia soluzione di cui sopra (la selezione del primo paragrafo del bodyContent- div. – theomega

8

Non è necessario.

Il parametro exintro dell'API restituisce solo la prima sezione (zeroth) dell'articolo.

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

Non ci sono altri parametri, anche:

  • exchars Lunghezza di estratti in caratteri.
  • exsentences Numero di frasi da restituire.
  • exintro Restituisce solo la sezione zeroth.
  • exsectionformat Quale formato sezione intestazione da utilizzare per gli estratti di testo in chiaro:

    wiki — e.g., == Wikitext == 
    plain — no special decoration 
    raw — this extension's internal representation 
    
  • exlimit Numero massimo di estratti di tornare.Poiché la generazione di stralci può essere lenta, il limite è limitato a 20 per gli estratti di sola introduzione e 1 per gli estratti di pagina intera.
  • explaintext Restituire estratti di testo normale.
  • excontinue Quando sono disponibili più risultati, utilizzare questo parametro per continuare.

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

Problemi correlati