Parsel: Cómo extraer texto de HTML en Python
Mihai Maxim el 31 Ene 2023

Introducción
El web scraping es el proceso automatizado de recopilación de datos de sitios web mediante el uso de un script o programa. Se utiliza para extraer información como texto, imágenes y otros tipos de datos que pueden ser útiles para distintos fines como la investigación, el análisis de datos o el análisis de mercado.
Hoy en día, hay un montón de soluciones cuando se trata de web scraping con Python. Selenium y Scrapy son algunas de las bibliotecas más utilizadas y populares. Aunque estas herramientas son geniales para tareas de scraping complicadas, pueden ser un poco abrumadoras para un uso casual.
Entra en Parsel, la pequeña biblioteca de scraping. Esta biblioteca ligera y fácil de aprender es perfecta para pequeños proyectos y es ideal para aquellos que son nuevos en el web scraping. Es capaz de analizar HTML y extraer datos utilizando selectores CSS y XPath, por lo que es una gran herramienta para cualquier amante de los datos en busca de una manera rápida y fácil de recopilar información de la web.
Abróchate el cinturón y prepárate para aprender a utilizar esta biblioteca mientras me acompañas en esta aventura de recopilación automatizada de datos. ¡Vamos a raspar!
Primeros pasos con Parsel
Puedes instalar la biblioteca Parsel con:
pip install parsel
Ahora vamos a sumergirnos directamente en un proyecto de ejemplo y a raspar los datos de todos los países de este sencillo sitio web https://www.scrapethissite.com/pages/simple/.
Para obtener el HTML del sitio web, deberá realizar una petición HTTP GET.
Haremos peticiones HTTP con la librería "requests" de Python, así que asegúrate de instalarla con:
pip install solicitudes
Ahora puedes obtener el HTML y escribirlo en un archivo:
import parsel
import requests
response = requests.get("https://www.scrapethissite.com/pages/simple/")
with open("out.html", "w", encoding="utf-8") as f:
f.write(response.text)
Y examinar la estructura:

Nuestros datos se almacenan en estructuras similares a ésta:
<div class="col-md-4 country">
<h3 class="country-name">
<i class="flag-icon flag-icon-af"></i>
Afghanistan
</h3>
<div class="country-info">
<strong>Capital:</strong> <span class="country-capital">Kabul</span><br>
<strong>Population:</strong> <span class="country-population">29121286</span><br>
<strong>Area (km<sup>2</sup>):</strong> <span class="country-area">647500.0</span><br>
</div>
</div><!--.col-->
Para escribir selectores, tendrás que pasar el HTML sin procesar a Parsel:
import parsel
import requests
response = requests.get("https://www.scrapethissite.com/pages/simple/")
raw_html = response.text
parsel_dom = parsel.Selector(text = raw_html)
Ahora estamos listos para escribir algunos selectores.
Extracción de texto mediante selectores CSS
Puede imprimir la capital del primer país con:
parsel_dom = parsel.Selector(text=raw_html)
first_capital = parsel_dom.css(".country-capital::text").get()
print(first_capital)
// Salida
Andorra la Vella
parsel_dom.css(".country-capital::text").get() seleccionará el texto interior del primer elemento que tenga la clase country-capital.
Puedes imprimir todos los nombres de los países con:
countries_names = filter(lambda line: line.strip() != "", parsel_dom.css(".country-name::text").getall())
for country_name in countries_names:
print(country_name.strip())
// Salida
Andorra
Emiratos Árabes Unidos
Afganistán
Antigua y Barbuda
Anguila
. . .
parsel_dom.css(".nombre-del-país::text").getall() seleccionará los textos interiores de todos los elementos que tengan la clase "nombre-del-país".
Notice that we had to clean-up the output a bit. We did that because all the elements that have the “.country-name” class also have an <i> tag nested inside of them. Also, the country name is surrounded by many trailing spaces.
<h3 class="country-name">
<i class="flag-icon flag-icon-ae"></i> //this is picked up as an empty string
United Arab Emirates // this is picked up as “ United Arab Emirates “
</h3>
Ahora vamos a escribir un script para extraer todos los datos con selectores CSS:
import parsel
import requests
response = requests.get("https://www.scrapethissite.com/pages/simple/")
raw_html = response.text
parsel_dom = parsel.Selector(text=raw_html)
countries = parsel_dom.css(".country")
countries_data = []
for country in countries:
country_name = country.css(".country-name::text").getall()[1].strip()
country_capital = country.css(".country-capital::text").get()
country_population = country.css(".country-population::text").get()
country_area = country.css(".country-area::text").get()
countries_data.append({
"name": country_name,
"capital": country_capital,
"population": country_population,
"area": country_area
})
for country_data in countries_data:
print(country_data)
// Outputs
{'name': 'Andorra', 'capital': 'Andorra la Vella', 'population': '84000', 'area': '468.0'}
{'name': 'United Arab Emirates', 'capital': 'Abu Dhabi', 'population': '4975593', 'area': '82880.0'}
{'name': 'Afghanistan', 'capital': 'Kabul', 'population': '29121286', 'area': '647500.0'}
...
Extracción de texto mediante selectores XPath
XPath es un lenguaje de consulta para seleccionar nodos de un documento XML. Son las siglas de XML Path Language, y utiliza una notación de ruta similar a la de las URL para navegar por los elementos y atributos de un documento XML. Las expresiones XPath pueden utilizarse para seleccionar un único elemento, un conjunto de elementos o un atributo específico de un elemento. XPath se utiliza principalmente en XSLT, pero también puede utilizarse para navegar por el Modelo de Objetos del Documento (DOM) de cualquier documento de lenguaje similar a XML, como HTML o SVG.
XPath puede parecer intimidante al principio, pero en realidad es bastante fácil empezar a usarlo una vez que se entienden los conceptos básicos y la sintaxis. Un recurso que puede ser útil es nuestra guía de selectores XPath en https://www.webscrapingapi.com/the-ultimate-xpath-cheat-sheet.
Ahora vamos a probar algunos selectores:
He aquí cómo imprimir el primer capitel:
parsel_dom = parsel.Selector(text=raw_html)
first_capital = parsel_dom.xpath('//*[@class="pais-capital"]/text()').get()
print(first_capital)
// Salida
Andorra la Vella
Y todos los nombres de países:
countries_names = filter(lambda line: line.strip() != "",
parsel_dom.xpath('//*[@class="nombre_país"]//text()').getall())
for nombre_país in nombres_países:
print(nombre_país.strip())
// Salida
Andorra la Vella
Abu Dhabi
Kabul
San Juan
El Valle
Tirana
...
Reimplementemos el script con selectores XPath:
import parsel
import requests
response = requests.get("https://www.scrapethissite.com/pages/simple/")
raw_html = response.text
parsel_dom = parsel.Selector(text=raw_html)
countries = parsel_dom.xpath('//div[contains(@class,"country")][not(contains(@class,"country-"))]')
countries_data = []
for country in countries:
country_name = country.xpath(".//h3/text()").getall()[1].strip()
country_capital = country.xpath(".//span/text()").getall()[0]
country_population = country.xpath(".//span/text()").getall()[1]
country_area = country.xpath(".//span/text()").getall()[2]
countries_data.append({
"name": country_name,
"capital": country_capital,
"population": country_population,
"area": country_area
})
for country_data in countries_data:
print(country_data)
// Output
{'name': 'Andorra', 'capital': 'Andorra la Vella', 'population': '84000', 'area': '468.0'}
{'name': 'United Arab Emirates', 'capital': 'Abu Dhabi', 'population': '4975593', 'area': '82880.0'}
{'name': 'Afghanistan', 'capital': 'Kabul', 'population': '29121286', 'area': '647500.0'}
...
Eliminar elementos
Eliminar elementos es sencillo. Basta con aplicar la función de eliminación a un selector:
selector.css(".mi_clase").drop()
Vamos a mostrar esta funcionalidad escribiendo un script que elimine el campo "población" de cada país:
import parsel
import requests
response = requests.get("https://www.scrapethissite.com/pages/simple/")
raw_html = response.text
parsel_dom = parsel.Selector(text=raw_html)
countries = parsel_dom.css(".country")
for country in countries:
country.css(".country-population").drop()
country.xpath(".//strong")[1].drop()
country.xpath(".//br")[1].drop()
countries_without_population_html = parsel_dom.get()
with open("out.html", "w", encoding="utf-8") as f:
f.write(countries_without_population_html)

Exportar los datos
Cuando hayas terminado de extraer los datos, es importante que pienses cómo quieres guardarlos. Dos formatos comunes para almacenar este tipo de datos son .json y .csv. Sin embargo, debes elegir el que mejor se adapte a las necesidades de tu proyecto.
Exportar los datos a .json
JSON (JavaScript Object Notation) es un formato ligero de intercambio de datos fácil de leer y escribir para los humanos y fácil de analizar y generar para las máquinas. Suele utilizarse para intercambiar datos entre una aplicación web y un servidor, o entre distintas partes de una aplicación web. JSON es similar a un diccionario Python, en el sentido de que se utiliza para almacenar datos en pares clave-valor, y puede utilizarse para almacenar y acceder al mismo tipo de datos y tener la misma estructura.
Exportar un array de diccionario Python a .json puede hacerse con la librería json:
import json
countries_dictionaries = [
{'name': 'Andorra', 'capital': 'Andorra la Vella', 'population': '84000', 'area': '468.0'},
{'name': 'United Arab Emirates', 'capital': 'Abu Dhabi', 'population': '4975593', 'area': '82880.0'}
]
json_data = json.dumps(countries_dictionaries, indent=4)
with open("data.json", "w") as outfile:
outfile.write(json_data)
// data.json
[
{
"name": "Andorra",
"capital": "Andorra la Vella",
"population": "84000",
"area": "468.0"
},
{
"name": "United Arab Emirates",
"capital": "Abu Dhabi",
"population": "4975593",
"area": "82880.0"
}
]
Exportar los datos a .csv
Un CSV es una forma sencilla de almacenar datos en un archivo de texto, donde cada línea representa una fila y cada valor está separado por una coma. Se utiliza a menudo en una hoja de cálculo o en programas de bases de datos. Python tiene un gran soporte incorporado para trabajar con archivos CSV, a través de su módulo csv. Una de las características más potentes del módulo CSV es la clase DictWriter, que permite escribir un diccionario Python en un fichero CSV de forma sencilla. Las claves del diccionario se utilizarán como cabeceras de columna en el fichero CSV, y los valores se escribirán como los datos correspondientes en las filas.
A continuación te mostramos cómo puedes utilizar la librería csv para exportar un array de diccionarios Python a .csv.
countries_dictionaries = [
{"name": "John Smith", "age": 35, "city": "New York"},
{"name": "Jane Doe", "age": 28, "city": "San Francisco"}
]
with open("data.csv", "w") as outfile:
writer = csv.DictWriter(outfile, fieldnames=countries_dictionaries[0].keys())
writer.writeheader()
for row in countries_dictionaries:
writer.writerow(row)
// data.csv
name,age,city
John Smith,35,New York
Jane Doe,28,San Francisco
Conclusión
En este artículo, hemos explorado el uso de la librería Parsel en Python. Hemos visto lo fácil que es utilizar los selectores CSS y XPath que Parsel proporciona para extraer datos de páginas web. En general, Parsel proporciona una solución eficiente y versátil para el web scraping. Si estás interesado en automatizar la recopilación de datos, deberías probarlo.
¿Quiere saber más sobre el web scraping? Eche un vistazo a nuestro producto, WebScrapingAPI, y descubra cómo puede llevar sus habilidades de extracción de datos al siguiente nivel. Nuestra potente API está diseñada específicamente para ayudarle a superar los retos más comunes del web scraping, como evitar las prohibiciones de IP o renderizar Javascript. ¿Y lo mejor de todo? Puede probarla gratis.
Noticias y actualidad
Manténgase al día de las últimas guías y noticias sobre raspado web suscribiéndose a nuestro boletín.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Artículos relacionados

Explore las complejidades del scraping de datos de productos de Amazon con nuestra guía en profundidad. Desde las mejores prácticas y herramientas como Amazon Scraper API hasta las consideraciones legales, aprenda a superar los desafíos, eludir los CAPTCHA y extraer información valiosa de forma eficiente.


Descubra cómo extraer y organizar datos de forma eficaz para el raspado web y el análisis de datos mediante el análisis sintáctico de datos, las bibliotecas de análisis sintáctico HTML y los metadatos de schema.org.


¿Son los selectores XPath mejores que los selectores CSS para el web scraping? Conozca los puntos fuertes y las limitaciones de cada método y tome la decisión correcta para su proyecto.
