python-3.x - what - tutorial de django
Cómo sacar texto plano de wikipedia (11)
"... un script que obtiene solo la sección de descripción de Wikipedia ..."
Para su aplicación, puede ver qué ver en los vertederos, por ejemplo, http://dumps.wikimedia.org/enwiki/20120702/
Los archivos particulares que necesita son archivos XML ''abstractos'', por ejemplo, este pequeño (22.7MB):
http://dumps.wikimedia.org/enwiki/20120702/enwiki-20120702-abstract19.xml
El XML tiene una etiqueta llamada "resumen" que contiene la primera parte de cada artículo.
De lo contrario, wikipedia2text utiliza, por ejemplo, w3m para descargar la página con plantillas expandidas y formateadas en texto. A partir de eso, usted puede elegir el resumen a través de una expresión regular.
He estado buscando por cerca de 2 meses para encontrar un script que obtenga solo la sección de descripción de Wikipedia. (Es para un bot que estoy construyendo, no para IRC). Es decir, cuando digo
/wiki bla bla bla
irá a la página de Wikipedia para bla bla bla
, obtenga lo siguiente y lo devolverá a la sala de chat:
"Bla Bla Bla" es el nombre de una canción hecha por Gigi D''Agostino. Describió esta canción como "una pieza que escribí pensando en todas las personas que hablan y hablan sin decir nada". Las muestras vocales prominentes pero sin sentido se han tomado de la canción de la banda británica Stretch "Why Did You Do It"
Aquí está lo más cercano que he encontrado, pero solo obtiene la URL:
import json
import urllib.request, urllib.parse
def google(searchfor):
query = urllib.parse.urlencode({''q'': searchfor})
url = ''http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s'' % query
search_response = urllib.request.urlopen(url)
search_results = search_response.read().decode("utf8")
results = json.loads(search_results)
data = results[''responseData'']
hits = data[''results'']
if len(hits) > 0:
return hits[0][''url'']
else:
return "No results found."
(Python 3.1)
Aquí hay algunos enfoques posibles diferentes; Usa lo que te funcione. Todos los ejemplos de mi código a continuación utilizan requests
para solicitudes HTTP a la API; puede instalar requests
con requests
instalación de pip install requests
si tiene Pip. Todos ellos también usan la API de Mediawiki , y dos usan el punto final de query ; Sigue esos enlaces si quieres documentación.
1. Obtenga una representación de texto sin formato de la página completa o de la página "extraer" directamente de la API con los extracts
prop.
Tenga en cuenta que este enfoque solo funciona en sitios de MediaWiki con la extensión TextExtracts . Esto incluye notablemente Wikipedia, pero no algunos sitios Mediawiki más pequeños como, por ejemplo, http://www.wikia.com/
Quieres golpear una URL como
Al desglosar eso, tenemos los siguientes parámetros ahí (documentados en https://www.mediawiki.org/wiki/Extension:TextExtracts#query+extracts ):
-
action=query
,format=json
, ytitle=Bla_Bla_Bla
son todos los parámetros estándar de la API de MediaWiki -
prop=extracts
extract nos hace usar la extensión TextExtracts -
exintro
limita la respuesta al contenido antes del encabezado de la primera sección -
explaintext
hace que el extracto en la respuesta sea texto simple en lugar de HTML
Luego analice la respuesta JSON y extraiga el extracto:
>>> import requests
>>> response = requests.get(
... ''https://en.wikipedia.org/w/api.php'',
... params={
... ''action'': ''query'',
... ''format'': ''json'',
... ''titles'': ''Bla Bla Bla'',
... ''prop'': ''extracts'',
... ''exintro'': True,
... ''explaintext'': True,
... }
... ).json()
>>> page = next(iter(response[''query''][''pages''].values()))
>>> print(page[''extract''])
"Bla Bla Bla" is the title of a song written and recorded by Italian DJ Gigi D''Agostino. It was released in May 1999 as the third single from the album, L''Amour Toujours. It reached number 3 in Austria and number 15 in France. This song can also be heard in an added remixed mashup with L''Amour Toujours (I''ll Fly With You) in its US radio version.
2. Obtenga el HTML completo de la página utilizando el punto final de análisis, analícelo y extraiga el primer párrafo
MediaWiki tiene un punto final de parse
que puede golpear con una URL como https://en.wikipedia.org/w/api.php?action=parse&page=Bla_Bla_Bla para obtener el HTML de una página. Luego puede analizarlo con un analizador HTML como lxml (instálelo primero con pip install lxml
) para extraer el primer párrafo.
Por ejemplo:
>>> import requests
>>> from lxml import html
>>> response = requests.get(
... ''https://en.wikipedia.org/w/api.php'',
... params={
... ''action'': ''parse'',
... ''page'': ''Bla Bla Bla'',
... ''format'': ''json'',
... }
... ).json()
>>> raw_html = response[''parse''][''text''][''*'']
>>> document = html.document_fromstring(raw_html)
>>> first_p = document.xpath(''//p'')[0]
>>> intro_text = first_p.text_content()
>>> print(intro_text)
"Bla Bla Bla" is the title of a song written and recorded by Italian DJ Gigi D''Agostino. It was released in May 1999 as the third single from the album, L''Amour Toujours. It reached number 3 in Austria and number 15 in France. This song can also be heard in an added remixed mashup with L''Amour Toujours (I''ll Fly With You) in its US radio version.
3. Analiza wikitext tú mismo
Puede usar la API de query
para obtener el wikitexto de la página, analizarla usando mwparserfromhell
(instálela primero usando pip install mwparserfromhell
), luego strip_code
texto legible por humanos usando strip_code
. strip_code
no funciona perfectamente al momento de escribir (como se muestra claramente en el siguiente ejemplo), pero es de esperar que mejore.
>>> import requests
>>> import mwparserfromhell
>>> response = requests.get(
... ''https://en.wikipedia.org/w/api.php'',
... params={
... ''action'': ''query'',
... ''format'': ''json'',
... ''titles'': ''Bla Bla Bla'',
... ''prop'': ''revisions'',
... ''rvprop'': ''content'',
... }
... ).json()
>>> page = next(iter(response[''query''][''pages''].values()))
>>> wikicode = page[''revisions''][0][''*'']
>>> parsed_wikicode = mwparserfromhell.parse(wikicode)
>>> print(parsed_wikicode.strip_code())
{{dablink|For Ke$ha''s song, see Blah Blah Blah (song). For other uses, see Blah (disambiguation)}}
"Bla Bla Bla" is the title of a song written and recorded by Italian DJ Gigi D''Agostino. It was released in May 1999 as the third single from the album, L''Amour Toujours. It reached number 3 in Austria and number 15 in France. This song can also be heard in an added remixed mashup with L''Amour Toujours (I''ll Fly With You) in its US radio version.
Background and writing
He described this song as "a piece I wrote thinking of all the people who talk and talk without saying anything". The prominent but nonsensical vocal samples are taken from UK band Stretch''s song "Why Did You Do It"''''.
Music video
The song also featured a popular music video in the style of La Linea. The music video shows a man with a floating head and no arms walking toward what appears to be a shark that multiplies itself and can change direction. This style was also used in "The Riddle", another song by Gigi D''Agostino, originally from British singer Nik Kershaw.
Chart performance
Chart (1999-00)PeakpositionIreland (IRMA)Search for Irish peaks23
References
External links
Category:1999 singles
Category:Gigi D''Agostino songs
Category:1999 songs
Category:ZYX Music singles
Category:Songs written by Gigi D''Agostino
Creo que la mejor opción es usar los prop de extracts
que te proporcionan la API de MediaWiki . Solo le devuelve algunas etiquetas (b, i, h #, span, ul, li) y elimina tablas, infoboxes, referencias, etc.
http://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Bla%20Bla%20Bla&format=xml le brinda algo muy simple:
<api><query><pages><page pageid="4456737" ns="0" title="Bla Bla Bla"><extract xml:space="preserve">
<p>"<b>Bla Bla Bla</b>" is the title of a song written and recorded by Italian DJ Gigi D''Agostino. It was released in May 1999 as the third single from the album, <i>L''Amour Toujours</i>. It reached number 3 in Austria and number 15 in France. This song can also be heard in an added remixed mashup with <i>L''Amour Toujours (I''ll Fly With You)</i> in its US radio version.</p> <p></p> <h2><span id="Background_and_writing">Background and writing</span></h2> <p>He described this song as "a piece I wrote thinking of all the people who talk and talk without saying anything". The prominent but nonsensical vocal samples are taken from UK band Stretch''s song <i>"Why Did You Do It"</i>.</p> <h2><span id="Music_video">Music video</span></h2> <p>The song also featured a popular music video in the style of La Linea. The music video shows a man with a floating head and no arms walking toward what appears to be a shark that multiplies itself and can change direction. This style was also used in "The Riddle", another song by Gigi D''Agostino, originally from British singer Nik Kershaw.</p> <h2><span id="Chart_performance">Chart performance</span></h2> <h2><span id="References">References</span></h2> <h2><span id="External_links">External links</span></h2> <ul><li>Full lyrics of this song at MetroLyrics</li> </ul>
</extract></page></pages></query></api>
Luego puedes ejecutarlo a través de una expresión regular, en JavaScript sería algo como esto (tal vez tengas que hacer algunas modificaciones menores:
/^.*</s*extract[^>]*/s*>/s*((?:[^<]*|</s*//?/s*[^>hH][^>]*/s*>)*).*</s*(?:h|H).*$/.exec(data)
Lo que te da (solo parapentes, negrita y cursiva):
" Bla Bla Bla " es el título de una canción escrita y grabada por el DJ italiano Gigi D''Agostino. Fue lanzado en mayo de 1999 como el tercer single del álbum, L''Amour Toujours . Alcanzó el número 3 en Austria y el número 15 en Francia. Esta canción también se puede escuchar en un mashup remezclado agregado con L''Amour Toujours (I''ll Fly With You) en su versión de radio estadounidense.
DBPedia es la solución perfecta para este problema. Aquí: http://dbpedia.org/page/Metallica , mire los datos perfectamente organizados utilizando RDF. Uno puede consultar cualquier cosa aquí en http://dbpedia.org/sparql usando SPARQL, el lenguaje de consulta para el RDF. Siempre hay una forma de encontrar el ID de página para obtener un texto descriptivo, pero esto debería funcionar en su mayor parte.
Habrá una curva de aprendizaje para RDF y SPARQL para escribir cualquier código útil, pero esta es la solución perfecta.
Por ejemplo, una consulta ejecutada para Metallica devuelve una tabla HTML con el resumen en varios idiomas diferentes:
<table class="sparql" border="1">
<tr>
<th>abstract</th>
</tr>
<tr>
<td><pre>"Metallica is an American heavy metal band formed..."@en</pre></td>
</tr>
<tr>
<td><pre>"Metallica es una banda de thrash metal estadounidense..."@es</pre></td>
...
CONSULTA DE SPARQL:
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
PREFIX dbpprop: <http://dbpedia.org/property/>
PREFIX dbres: <http://dbpedia.org/resource/>
SELECT ?abstract WHERE {
dbres:Metallica dbpedia-owl:abstract ?abstract.
}
Cambie "Metallica" a cualquier nombre de recurso (nombre de recurso como en wikipedia.org/resourcename) por consultas relacionadas con el resumen.
Primero verifique here .
Hay muchas sintaxis no válidas en el marcado de texto de MediaWiki. (Errores cometidos por los usuarios ...) Solo MediaWiki puede analizar este texto infernal. Pero todavía hay algunas alternativas para probar en el enlace de arriba. ¡No perfecto, pero mejor que nada!
Puede obtener datos de wiki en formatos de texto. Si necesita acceder a la información de muchos títulos, puede obtener todos los datos de la wiki del título en una sola llamada. Utilice el carácter de canalización (|) para separar cada título.
Aquí, esta llamada api devuelve los datos de Google y de Yahoos.
explaintext
=> Devuelve extractos como texto sin formato en lugar de HTML limitado.
exlimit = max
(ahora es 20); De lo contrario solo volverá un resultado.
exintro
=> Regresar solo contenido antes de la primera sección. Si desea datos completos, simplemente elimine esto.
redirects=
Resolver problemas de redireccionamiento.
Puede probar WikiExtractor: http://medialab.di.unipi.it/wiki/Wikipedia_Extractor
Es para Python 2.7 y 3.3+.
Puede probar la biblioteca de análisis de HTML BeautifulSoup para python, pero tendrá que escribir un analizador simple.
Puedes obtener solo la primera sección usando la API:
http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvsection=0&titles=Bla%20Bla%20Bla&rvprop=content
Esto te dará wikitext en bruto, tendrás que lidiar con las plantillas y el marcado.
O puede obtener toda la página representada en HTML, que tiene sus pros y sus contras en lo que respecta al análisis:
http://en.wikipedia.org/w/api.php?action=parse&prop=text&page=Bla_Bla_Bla
No puedo ver una forma fácil de obtener el HTML analizado de la primera sección en una sola llamada, pero puede hacerlo con dos llamadas pasando el wikitexto que recibió de la primera URL con text=
en lugar de la page=
en la segunda URL.
ACTUALIZAR
Lo siento, descuidé la parte "texto sin formato" de su pregunta. Obtenga la parte del artículo que desea como HTML. ¡Es mucho más fácil eliminar HTML que eliminar wikitext!
También existe la oportunidad de consumir páginas de Wikipedia a través de una API de envoltura como JSONpedia , que funciona tanto en vivo (solicite la representación actual de JSON de una página Wiki) como en el almacenamiento (consulte varias páginas previamente ingeridas en Elasticsearch y MongoDB). El JSON de salida también incluye texto de página sin formato.
Utilice la API de MediaWiki , que se ejecuta en Wikipedia. Tendrá que hacer un análisis de los datos usted mismo.
Por ejemplo:
fetch (acción = consulta) el contenido (rvprop = contenido) de la revisión más reciente de la página principal (título = Main% 20Page) en formato JSON (formato = json).
Probablemente querrá buscar la consulta y usar el primer resultado, para manejar los errores de ortografía y similares.