2017-05-06 5 views
1

J'essaie d'extraire des URL spécifiques sur une page Web basée sur l'attribut CSS. Je peux tirer le premier, mais j'ai de la difficulté à obtenir l'URL complète ou à obtenir plus d'une URL.Scrapy parse html chaînes à partir de la page Web basée sur l'attribut css

J'ai essayé et rencontré de nombreux problèmes en utilisant joinurl ou parse. Je continue d'obtenir des erreurs globales avec joinurl.

Existe-t-il un moyen plus simple de le faire?


J'utilise Centos 6.5 & Python 2.7.5

Ce code ci-dessous fournira la première URL, mais pas le http://www...inline

import scrapy 

class PdgaSpider(scrapy.Spider): 
name = "pdgavideos" # Name of the Spider, required value 

start_urls = ["http://www.pdga.com/videos/"] 

# Entry point for the spiders 
def parse(self, response): 
    SET_SELECTOR = 'tbody' 
    for brickset in response.css(SET_SELECTOR): 

     HTML_SELECTOR = 'td.views-field.views-field-title a ::attr(href)' 
     yield { 
      'http://www.pdga.com': brickset.css(HTML_SELECTOR).extract()[0] 
     } 

Courant de sortie

http://www.pdga.com
/vidéos/2017-verre soufflé-open-fpo-rd-2-pt-2-poinçonneur-Fajkus-leatherman-c-allen-sacristain-leatherman

Résultat attendu

la liste complète des URL sans interruption

Je n'ai pas assez de points de réputation pour poster un couple exemples

Répondre

1

Afin d'obtenir urls absolu de liens relatifs, vous pouvez utiliser la méthode Scrapy urljoin() et réécrire votre code comme ceci:

import scrapy 

class PdgaSpider(scrapy.Spider): 
    name = "pdgavideos" 
    start_urls = ["http://www.pdga.com/videos/"] 

    def parse(self, response): 
     for link in response.xpath('//td[2]/a/@href').extract(): 
      yield scrapy.Request(response.urljoin(link), callback=self.parse_page) 

     # If page contains link to next page extract link and parse 
     next_page = response.xpath('//a[contains(., "next")]/@href').extract_first() 
     if next_page: 
      yield scrapy.Request(response.urljoin(next_page), callback=self.parse) 

    def parse_page(self, response): 
     link = response.xpath('//iframe/@src').extract_first() 
     yield{ 
      'you_tube_link': 'http:' + link.split('?')[0] 
     } 

# To save links in csv format print in console: scrapy crawl pdgavideos -o links.csv 
# http://www.youtube.com/embed/tYBF-BaqVJ8 
# http://www.youtube.com/embed/_H0hBBc1Azg 
# http://www.youtube.com/embed/HRbKFRCqCos 
# http://www.youtube.com/embed/yz3D1sXQkKk 
# http://www.youtube.com/embed/W7kuKe2aQ_c 
+0

vous remercie tous les deux Tiny.D et Vold pour votre réponse rapide! C'est exactement ce que je cherchais à réaliser. vold: suis-je capable de sortir les données sans le lien de mot ou toute autre chose affichée avant les résultats? – Thomas

+0

Vous êtes les bienvenus. Comme @ Tiny.D l'a déjà signalé: Scrapy doit renvoyer une nouvelle requête ou un nouvel item ou dictionnaire. Si vous voulez simplement afficher la chaîne avec l'url dans la console, il vaut mieux utiliser 'requests' avec les parsers' bs4' ou 'lxml'. – vold

+0

@Thomas J'ai édité ma réponse pour fournir plus de sortie désirée. – vold

1

Votre code renvoie un dictionnaire, c'est pourquoi il est pause:

{'http://www.pdga.com': u'/videos/2017-glass-blown-open-fpo-rd-2-pt-2-pierce-fajkus-leatherman-c-allen-sexton-leatherman'} 

ce que vous pouvez faire est de rendre le rendement de ce dictionnaire comme celui-ci:

yield { 
    'href_link':'http://www.pdga.com'+brickset.css(HTML_SELECTOR).extract()[0] 
} 

Cela vous donnera une nouvelle dict la valeur est pas href rupture.

{'href_link': u'http://www.pdga.com/videos/2017-glass-blown-open-fpo-rd-2-pt-2-pierce-fajkus-leatherman-c-allen-sexton-leatherman'} 

Remarque: Spider doit retourner Demande, BASEITEM, dict ou None, reportez-vous à parse function.