Scrapy

Raspagem com seletores XPath

Raspagem com seletores XPath
HTML é a linguagem das páginas da web, e há muitas informações penduradas entre a abertura e o fechamento de cada página html marcação. Existem muitas maneiras de acessar isso, no entanto, neste artigo, faríamos isso usando o seletor Xpath por meio da biblioteca Scrapy do Python.

A biblioteca Scrapy é uma biblioteca de web scraping muito poderosa, fácil de usar também. Se você é novo nisso, pode seguir o tutorial disponível sobre como usar a biblioteca Scrapy.

Este tutorial cobre o uso de seletores Xpath. Xpath usa path como sintaxe para navegar nos nós de documentos XML. Eles também são úteis para navegar em tags HTML.

Ao contrário do tutorial do Scrapy, faremos todas as nossas operações aqui no terminal para simplificar. Isso não significa que o Xpath não pode ser usado com o programa Scrapy adequado, porém, eles podem ser usados ​​na biblioteca de análise no parâmetro de resposta.

Vamos trabalhar com o exemplo.Raspagem da web.com site, pois é muito simples e ajudaria a entender os conceitos.

Para usar o scrapy em nosso terminal, digite o comando abaixo:

$ scrapy shell http: // exemplo.Raspagem da web.com

Ele visitaria o site e obteria as informações necessárias, então nos deixaria com um shell interativo para trabalhar. Você deverá ver um prompt como:

Em 1]:

A partir da sessão interativa, trabalharemos com o resposta objeto.

Esta é a aparência de nossa sintaxe na maior parte deste artigo:

Em [1]: resposta.xpath ('xpathsyntax').extrair()

Este comando acima é usado para extrair todas as tags correspondentes de acordo com a sintaxe Xpath e então armazená-las em uma lista.

Em [2]: resposta.xpath ('xpathsyntax').extract_first ()

Este comando acima é usado para extrair apenas a primeira tag correspondida e armazená-la em uma lista.
Agora podemos começar a trabalhar na sintaxe Xpath.

NAVEGANDO ETIQUETAS

Navegar nas tags no Xpath é muito fácil, tudo o que é necessário é a barra "/" seguida do nome da tag.

Em [3]: resposta.xpath ('/ html').extrair()

O comando acima retornaria o html tag e tudo o que ela contém como um único item em uma lista.

Se quisermos obter o corpo da página da web, usaremos o seguinte:

Em [4]: ​​resposta.xpath ('/ html / body').extrair()

O Xpath também permite o caractere curinga “*”, que corresponde a tudo no nível em que é usado.

Em [5]: resposta.xpath ('/ *').extrair()

O código acima corresponderia a tudo no documento. A mesma coisa acontece quando usamos '/ html'.

Em [6]: resposta.xpath ('/ html / *').extrair()

Além das tags de navegação, podemos obter todas as tags descendentes de uma tag específica usando o "//".

Em [7]: resposta.xpath ('/ html // a').extrair()

O código acima retornaria todas as tags âncora na tag html i.e. ele retornaria uma lista de todas as marcas âncora descendentes.

TAGS POR ATRIBUTOS E SEUS VALORES

Às vezes, navegar nas tags html para chegar à tag necessária pode ser um problema. Este problema pode ser evitado simplesmente encontrando a tag necessária por seu atributo.

Em [8]: resposta.xpath ('/ html // div [@id = "pagination"]').extrair()

O código acima retorna todos os div tags sob o html tag que tem o eu ia atributo com um valor de paginação.

Em [9]: resposta.xpath ('/ html // div [@class = "span12"]').extrair()

O código acima retornaria uma lista de todos os div tags sob a tag html, apenas se eles tiverem o atributo class com um valor de span12.

E se você não souber o valor do atributo? E tudo o que você deseja é obter tags com um atributo específico, sem se preocupar com seu valor. Fazer isso também é simples, tudo o que você precisa fazer é usar apenas o símbolo @ e o atributo.

Em [10]: resposta.xpath ('/ html // div [@class]').extrair()

Este código retornaria uma lista de todas as tags div que contêm o atributo class independentemente do valor que o atributo class possui.

Que tal se você souber apenas alguns caracteres contidos no valor de um atributo? Também é possível obter esses tipos de tags.

Em [11]: resposta.xpath ('/ html // div [contains (@id, "ion")]').extrair()

O código acima retornaria todas as tags div sob a tag html que têm o atributo id, no entanto, não sabemos qual valor o atributo contém, exceto que sabemos que contém "íon".

A página que estamos analisando tem apenas uma tag nesta categoria, e o valor é “paginação” para que ela seja retornada.

Legal certo?

TAGS POR SEU TEXTO

Lembre-se de que combinamos as tags por seus atributos anteriormente. Também podemos combinar as tags pelo seu texto.

Em [12]: resposta.xpath ('/ html // a [.= "Argélia"] ').extrair()

O código acima nos ajudaria a obter todas as tags âncora que contêm o texto "Argélia". NB: devem ser tags com exatamente esse conteúdo de texto.

Maravilhoso.

Que tal se não soubermos exatamente o conteúdo do texto, e apenas conhecermos uma parte do conteúdo do texto? Podemos fazer isso também.

Em [13]: resposta.xpath ('/ html // a [contém (text (), "A")]').extrair()

O código acima obteria as tags que possuem a letra “A” em seu conteúdo de texto.

EXTRAINDO O CONTEÚDO DA TAG

O tempo todo, conversamos sobre como encontrar as tags certas. É hora de extrair o conteúdo da tag quando o encontrarmos.

É bem simples. Tudo o que precisamos fazer é adicionar “/ text ()” à sintaxe, e o conteúdo da tag será extraído.

Em [14]: resposta.xpath ('/ html // a / text ()').extrair()

O código acima obteria todas as tags âncora no documento html e, em seguida, extrairia o conteúdo do texto.

EXTRAINDO OS LINKS

Agora que sabemos como extrair o texto em tags, devemos saber como extrair os valores dos atributos. Na maioria das vezes, os valores dos atributos de extrema importância para nós são links.

Fazer isso é quase o mesmo que extrair os valores do texto, no entanto, em vez de usar “/ text ()”, usaríamos o símbolo “/ @” e o nome do atributo.

Em [15]: resposta.xpath ('/ html // a / @ href').extrair()

O código acima iria extrair todos os links nas tags âncora, os links deveriam ser os valores do href atributo.

NAVEGANDO ETIQUETAS DE IRMÃOS

Se você percebeu, estivemos navegando nas tags todo esse tempo. No entanto, há uma situação que não resolvemos.

Como selecionamos uma tag específica quando as tags com o mesmo nome estão no mesmo nível?




Afeganistão




Ilhas Aland


Em um caso como o que temos acima, se formos olhar para ele, podemos dizer que usaríamos extract_first () para conseguir a primeira partida.

No entanto, e se quisermos corresponder ao segundo? E se houver mais de dez opções e quisermos a quinta? Nós vamos responder isso agora.

Aqui está a solução: quando escrevemos nossa sintaxe Xpath, colocamos a posição da tag que queremos entre colchetes, assim como estamos indexando, mas o índice começa em 1.

Olhando para o html da página da web com a qual estamos lidando, você notaria que há muitos tags no mesmo nível. Para obter o terceiro tag, usaríamos o seguinte código:

Em [16]: resposta.xpath ('/ html // tr [3]').extrair()

Você também notaria que o as tags são duplas, se quisermos apenas a segunda tags do linhas, faríamos o seguinte:

Em [17]: resposta.xpath ('/ html // td [2]').extrair()

CONCLUSÃO:

Xpath é uma maneira muito poderosa de analisar arquivos html e pode ajudar a minimizar o uso de expressões regulares ao analisá-los, considerando que tem o contém função em sua sintaxe.

Existem outras bibliotecas que permitem a análise com o Xpath, como Selenium para automação web. O Xpath nos dá muitas opções durante a análise de html, mas o que foi tratado neste artigo deve ser capaz de conduzi-lo por meio de operações comuns de análise de html.

Como instalar o League Of Legends no Ubuntu 14.04
Se você é fã de League of Legends, esta é uma oportunidade para testar o funcionamento de League of Legends. Observe que LOL é suportado no PlayOnLinu...
Instale o último jogo de estratégia OpenRA no Ubuntu Linux
OpenRA é um motor de jogo de estratégia em tempo real Libre / Free que recria os primeiros jogos Westwood como o clássico Command & Conquer: Red Alert...
Instale o emulador Dolphin mais recente para Gamecube e Wii no Linux
O Dolphin Emulator permite que você jogue seus jogos de Gamecube e Wii escolhidos em computadores pessoais Linux (PC). Sendo um emulador de jogo disp...