Scrapy com seletores XPath

Scrapy com seletores XPath
HTML é o idioma das páginas da web, e há muitas informações penduradas entre todas html marcação. Existem muitas maneiras de acessar isso, no entanto, neste artigo, estaríamos fazendo isso usando o seletor XPath através da Biblioteca de Scrapy da Python.

A Biblioteca de Scrapy é uma biblioteca de raspagem na web muito poderosa, fácil de usar também. Se você é novo nisso, pode seguir o tutorial disponível sobre o uso da biblioteca de scrapy.

Este tutorial cobre o uso de seletores XPath. XPath usa caminho como sintaxe para navegar nos nós dos documentos XML. Eles também são úteis na navegação de tags html.

Ao contrário do tutorial de scrapy, vamos fazer todas as nossas operações aqui no terminal por causa da simplicidade. Isso não significa que o XPath não pode ser usado com o programa de scrapy adequado, eles podem ser utilizados na biblioteca Parse no parâmetro de resposta.

Nós 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, depois nos deixaria com um shell interativo para trabalhar. Você deve ver um rápido como:

Em 1]:

Na sessão interativa, vamos trabalhar com o resposta objeto.

Aqui está como seria a 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 depois a armazena em uma lista.

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

Este comando acima é usado para extrair apenas a primeira tag correspondente e a armazena em uma lista.
Agora podemos começar a trabalhar na sintaxe XPath.

Navegando tags

Navegando tags no XPath é muito fácil, tudo o que é necessário é o atacante "/" seguido pelo nome da tag.

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

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

Se quisermos obter o corpo da página da web, usaríamos o seguinte:

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

XPath também permite o personagem 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. O mesmo acontece quando usamos '/html'.

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

Além disso, navegando tags, 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 de ancoragem na tag html i.e. ele retornaria uma lista de todas as etiquetas de ancoragem descendente.

Tags por atributos e seus valores

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

Em [8]: resposta.xpath ('/html // div [@id = "paginação"]').extrair()

O código acima retorna todo o div tags sob o html tag que tem o eu ia atribuir 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 tiverem o atributo de classe com um valor de span12.

E se você não souber o valor do atributo? E tudo o que você quer é obter tags com um atributo específico, sem preocupação com o 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 de classe, independentemente do valor que o atributo de classe possui.

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

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

O código acima retornaria todas as tags da div na tag HTML que possuem o atributo de ID, no entanto, não sabemos que valor o atributo reserva, exceto que sabemos que ele contém "íon".

A página que estamos analisando tem apenas uma tag nessa categoria, e o valor é "paginação" para que seja devolvido.

Legal certo?

Tags por seu texto

Lembre -se de que combinamos tags por seus atributos mais cedo. Também podemos combinar tags com o texto deles.

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

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

Maravilhoso.

Que tal se não sabemos no conteúdo exato do texto, e só sabemos alguns 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 receberia as tags que têm a letra "A" em seu conteúdo de texto.

Extraindo o conteúdo da tag

O tempo todo, estamos conversando sobre 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 seria extraído.

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

O código acima obteria todas as tags de âncora no documento HTML e depois 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 de atributos que são de extrema importância para nós são links.

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

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

O código acima extrairia todos os links nas tags de âncora, os links devem ser os valores do Href atributo.

Navegando tags de irmãos

Se você percebeu, estamos navegando em tags o tempo todo. No entanto, há uma situação que não abordamos.

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




Afeganistão




Ilhas Aland


Em um caso como o que temos acima, se quisermos 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 queremos o quinto? 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á muito tags no mesmo nível. Para conseguir o terceiro Tag, usaríamos o seguinte código:

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

Você também notaria que o Tags estão em dois, se queremos apenas o segundo 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 em analisá -los, considerando que ele tem o contém função em sua sintaxe.

Existem outras bibliotecas que permitem analisar com Xpath, como o Selenium para automação da Web. O XPath nos dá muitas opções enquanto analisa HTML, mas o que foi tratado neste artigo deve ser capaz de levá -lo através de operações comuns de análise HTML.