5

Me pregunto si hay alguna biblioteca existente o accesible desde Objective-C que me permita raspar páginas formateadas como this one. Específicamente, todas las fechas y todo el texto al lado de cada fecha. Si no, ¿cuál sería la mejor manera de hacerlo? ¿Expresiones regulares? Escuché que NSString ya podría tener métodos integrados para esto. ¿Es esto cierto?Raspado y análisis de una página de Wikipedia

Estaba buscando para ver si había alguna alternativa al raspado, como un archivo XML o API. Encontré una API, pero los únicos clientes que veo disponibles están en otros idiomas y parece que solo pueden publicar contenido en páginas, no recuperarlo.

EDITAR: Por lo que se encontró más información sobre la API en estos enlaces:

Y yo era capaz de llegar a this request que devuelve algo de HTML texto codificado (Bueno, el formato es XML, pero incluye el texto de la página como »a href= etc. Seguiré revisando los documentos para ver si puedo hacer e esto sale un poco mejor, si no, ¿hay alguna recomendación para analizar esto?

EDIT 2: Muy bien, así que gracias a this doc page, la manera más simple y más limpio que he sido capaz de recuperar los datos está utilizando este constructed link que devuelve los datos en bruto (En el código wiki) de la sección correspondiente. Sin embargo, supongo que necesitaría analizar eso, aunque si ese es realmente el caso, debería ser mucho más fácil que todo el artículo.

¿Alguien tiene alguna recomendación para analizar el marcado de wiki como el siguiente en Objective-C?

==Events== 
* [[710]] – [[Saracen]] invasion of [[Sardinia]]. 
*[[1275]] – Traditional founding of the city of [[Amsterdam]]. 
*[[1682]] – [[Philadelphia]], [[Pennsylvania]] is founded. 

Lo que quiero llegar a tener es, supongo NSDictionary una colección o similares que almacenará la fecha con el fragmento acompaña de información. ¡Gracias!

Respuesta

1

Voy a ir con la sugerencia de expresiones regulares para la extracción de datos específicos en una secuencia de datos HTML mixtos.

Ya hay bibliotecas RegEx en el teléfono, pero están algo ocultas, puedes exponerlas con unas pocas llamadas simples usando RegexKitLite (asegúrate de desplazarte hacia abajo y obtener la versión ligera). Termina siendo una clase con algunas extensiones en NSString que le permite hacer expresiones regulares, luego definiría una expresión regular con dos coincidencias capturadas, una para el número y otra para el contenido, junto con una cantidad de coincidencias no capturadas para las etiquetas adjuntas e intermedias. A pesar de que es una versión "ligera" de RegEX estándar, ahora soporta casi cualquier habilidad que necesite.

El enfoque de API es prometedor, pero una vez que obtenga el marcado sin procesar, probablemente tendrá que tomar un enfoque de expresiones regulares similar para analizar los datos a partir de eso. Todavía podría tener sentido si reduce la complejidad de la expresión regular y el tiempo de transferencia de datos, sin embargo, no hay razón por la que no pueda combinar ambos enfoques.

+0

Gracias por eso, lo aprecio. Creo que la forma en que voy a ir (la única forma en que puedo ver de hacer esto) es obtener los datos brutos y luego analizarlos de alguna manera. He incluido un ejemplo de los datos anteriores, aunque lo más probable es que cree una nueva pregunta para eso. –

+0

Esa nueva información es mucho más fácil de analizar. Me encargaría de eso buscando el rango de cadenas que comienza después de Eventos, luego haciendo una coincidencia contra números puros entre corchetes, junto con cualquier cosa después de la ndash hasta el final de la línea. . Entonces solo tendrías que quitar todos los caracteres "[" y "]" y estarías listo. Más fácil de procesar que el HTML, que es súper enlace pesado. –

+0

Gracias, ¿te importaría responder a mi pregunta posterior sobre el análisis sintáctico? http://stackoverflow.com/questions/1634012/how-to-parse-some-wiki-markup ¡Gracias! –

0

definitivamente no es la manera de hacerlo, en cualquier idioma.

si algún sitio en línea va a exponer sus datos de una manera agradable, será wikipedia.

busca obtener un artículo como XML, como RDF, o incluso como JSON.

+0

Eso es lo que estoy preguntando, si hay alguna manera de recuperar los datos en un buen formato, pero no lo parece, por lo que he visto. –

3

Dado que las páginas en Wikipedia se almacenan como texto sin formato, y los usuarios las ingresan como texto sin formato, no obtendrá un conjunto de datos estructurados a partir de él.

4

Agregue &format=fmt al final de su consulta, como se describe en API:Data_formats. Su consulta se convierte en: JSON query, por ejemplo. Puede especificar XML, JSON o muchos otros formatos.

Puede analizar fácilmente las secciones generales, y luego simplemente mostrar la salida con formato HTML en una vista web.

+0

¡Gracias! Sí, lo había visto, pero el archivo devuelto es mucho más grande que el archivo sin procesar que pude recuperar. La desventaja es que está en el marcado de wiki en lugar de HTML, pero de todos modos no estaba planeando renderizar el contenido devuelto en una vista web. Prefiero tener los datos reales para poder manipular su presentación fácilmente. Aunque aprecio la respuesta. –

3

He recogido una gran cantidad de datos de WP de varias maneras. el formato depende de muchas cosas, incluyendo en qué tipo de subdominio está la información y cuándo se ingresó. El texto principal es de formato libre y no hay una manera simple de rasparlo. Las infoboxes están en un formato especial de WP que ha cambiado a lo largo de los años. No fue diseñado para ser raspado.

Hay un WP de respaldo de base de datos que es algo más estructurado.

Con mucho, la mejor estrategia es ponerse en contacto con los wikipedistas en el dominio que desea para raspar - sabrán sobre el formato de base de datos y así pueden ser capaces de ayudar - que sin duda desee para ayudar a que ellos van a querer ver WP en forma semántica (como DBPedia - http://dbpedia.org/About).

2

¿Cuenta Python? ;) Es accesible desde Objective-C. Y existen excelentes módulos para raspar: Beautiful Soap y/o mecanize, también puedes considerar lxml.

0

Tengo una aplicación de iPhone que hace un roce la pantalla utilizando la siguiente:

Usando que YQL puede obtener la información que necesita de la web mediante el uso de consultas XPATH contra el DOM.

Personalmente creo que es mucho mejor que usar Regex. Por otra parte, solo sé expresiones regulares muy simples.

Cuestiones relacionadas