O XPath é uma linguagem de consulta para selecionar nós de um documento XML. Significa XML Path Language e utiliza uma notação de caminho semelhante à dos URLs para navegar pelos elementos e atributos de um documento XML. As expressões XPath podem ser utilizadas para selecionar um único elemento, um conjunto de elementos ou um atributo específico de um elemento. O XPath é utilizado principalmente em XSLT, mas também pode ser utilizado para navegar pelo Modelo de Objetos de Documento (DOM) de qualquer documento em linguagem semelhante a XML, como HTML ou SVG.
O XPath pode parecer intimidante à primeira vista, mas na verdade é bastante fácil começar a utilizá-lo assim que se compreendem os conceitos básicos e a sintaxe. Um recurso que pode ser útil é o nosso guia de seletores XPath em https://www.webscrapingapi.com/the-ultimate-xpath-cheat-sheet.
Agora vamos experimentar alguns seletores:
Eis como pode imprimir a primeira letra maiú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
E todos os nomes 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
...
Vamos reimplementar o script com seletores 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'}
...