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 se pueden utilizar 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 usarse para navegar por el Modelo de Objetos de Documento (DOM) de cualquier documento en un lenguaje similar a XML, como HTML o SVG.
XPath puede parecer intimidante al principio, pero en realidad es bastante fácil empezar a utilizarlo una vez que se comprenden los conceptos básicos y la sintaxis. Un recurso que puede resultar útil es nuestra guía de selectores XPath en https://www.webscrapingapi.com/the-ultimate-xpath-cheat-sheet.
Ahora probemos algunos selectores:
Así es como puedes imprimir la primera letra mayúscula:
parsel_dom = parsel.Selector(text=raw_html)
first_capital = parsel_dom.xpath('//*[@class="country-capital"]/text()').get()
print(first_capital)
// Output
Andorra la Vella
Y todos los nombres de países:
countries_names = filter(lambda line: line.strip() != "",
parsel_dom.xpath('//*[@class="country-name"]//text()').getall())
for country_name in countries_names:
print(country_name.strip())
// Output
Andorra la Vella
Abu Dhabi
Kabul
St. John's
The Valley
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'}
...