Scrapy - Seletores
Descrição
Quando você está copiando as páginas da web, você precisa extrair uma certa parte do código-fonte HTML usando o mecanismo chamado selectors, obtido usando expressões XPath ou CSS. Os seletores são construídos sobrelxml biblioteca, que processa o XML e HTML em linguagem Python.
Use o seguinte snippet de código para definir diferentes conceitos de seletores -
<html>
<head>
<title>My Website</title>
</head>
<body>
<span>Hello world!!!</span>
<div class = 'links'>
<a href = 'one.html'>Link 1<img src = 'image1.jpg'/></a>
<a href = 'two.html'>Link 2<img src = 'image2.jpg'/></a>
<a href = 'three.html'>Link 3<img src = 'image3.jpg'/></a>
</div>
</body>
</html>
Construindo Seletores
Você pode construir as instâncias da classe do seletor passando o text ou TextResponseobjeto. Com base no tipo de entrada fornecido, o seletor escolhe as seguintes regras -
from scrapy.selector import Selector
from scrapy.http import HtmlResponse
Usando o código acima, você pode construir a partir do texto como -
Selector(text = body).xpath('//span/text()').extract()
Ele exibirá o resultado como -
[u'Hello world!!!']
Você pode construir a partir da resposta como -
response = HtmlResponse(url = 'http://mysite.com', body = body)
Selector(response = response).xpath('//span/text()').extract()
Ele exibirá o resultado como -
[u'Hello world!!!']
Usando Seletores
Usando o trecho de código simples acima, você pode construir o XPath para selecionar o texto que é definido na tag de título conforme mostrado abaixo -
>>response.selector.xpath('//title/text()')
Agora, você pode extrair os dados textuais usando o .extract() método mostrado a seguir -
>>response.xpath('//title/text()').extract()
Ele produzirá o resultado como -
[u'My Website']
Você pode exibir o nome de todos os elementos mostrados a seguir -
>>response.xpath('//div[@class = "links"]/a/text()').extract()
Ele exibirá os elementos como -
Link 1
Link 2
Link 3
Se você deseja extrair o primeiro elemento, use o método .extract_first(), mostrado a seguir -
>>response.xpath('//div[@class = "links"]/a/text()').extract_first()
Ele exibirá o elemento como -
Link 1
Seletores de aninhamento
Usando o código acima, você pode aninhar os seletores para exibir o link da página e a fonte da imagem usando o .xpath() método, mostrado a seguir -
links = response.xpath('//a[contains(@href, "image")]')
for index, link in enumerate(links):
args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract())
print 'The link %d pointing to url %s and image %s' % args
Ele exibirá o resultado como -
Link 1 pointing to url [u'one.html'] and image [u'image1.jpg']
Link 2 pointing to url [u'two.html'] and image [u'image2.jpg']
Link 3 pointing to url [u'three.html'] and image [u'image3.jpg']
Seletores usando expressões regulares
Scrapy permite extrair os dados usando expressões regulares, que usam o .re()método. Do código HTML acima, iremos extrair os nomes das imagens mostrados a seguir -
>>response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')
A linha acima exibe os nomes das imagens como -
[u'Link 1',
u'Link 2',
u'Link 3']
Usando XPaths Relativos
Quando você está trabalhando com XPaths, que começa com o /, os seletores aninhados e o XPath estão relacionados ao caminho absoluto do documento e não ao caminho relativo do seletor.
Se você deseja extrair o <p> elementos, então primeiro ganhe todos os elementos div -
>>mydiv = response.xpath('//div')
Em seguida, você pode extrair todos os 'p' elementos dentro, prefixando o XPath com um ponto como .//p como mostrado abaixo -
>>for p in mydiv.xpath('.//p').extract()
Usando extensões EXSLT
O EXSLT é uma comunidade que emite as extensões para o XSLT (Extensible Stylesheet Language Transformations) que converte documentos XML em documentos XHTML. Você pode usar as extensões EXSLT com o namespace registrado nas expressões XPath, conforme mostrado na tabela a seguir -
Sr. Não | Prefixo e uso | Namespace |
---|---|---|
1 | re expressões regulares |
|
2 | set manipulação de conjuntos |
Você pode verificar o formato de código simples para extrair dados usando expressões regulares na seção anterior.
Existem algumas dicas XPath, que são úteis ao usar XPath com seletores Scrapy. Para mais informações, clique neste link .