2017-05-06 140 views
1

我试图根据CSS属性在网页上拉出特定的URL。我可以拉第一个,但我很难获取完整的URL或获取多个URL。Scrapy从基于CSS属性的网页解析html字符串

我已经尝试使用joinurl或parse来解决许多问题。我一直用joinurl得到全局错误。

有没有更简单的方法呢?


我使用的Centos 6.5 &的Python 2.7.5

这下面的代码将第一次提供的网址,而不是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] 
     } 

电流输出

http://www.pdga.com
/视频/ 2017玻璃吹开-FPO-RD-2-PT-2-皮尔斯fajkus-莱瑟曼-C-的Allen-司事-莱瑟曼

期望输出

网址的完整列表,没有任何休息

我没有足够的信誉分发布了几个例子

回答

1

为了从相对链接获得绝对URL,你可以使用Scrapy urljoin()方法和重写你这样的代码:

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

谢谢两位Tiny.D和进程vold您的快速反应!这正是我期望实现的目标。 vold:我能够输出没有单词链接或结果之前显示的其他任何内容的数据吗? – Thomas

+0

不客气。 As @ Tiny.D已经指出:Scrapy必须返回新的Request或Item或字典。如果你想在控制台中简单地输出带有url的字符串,你最好使用带'bs4'或'lxml'分析器的'requests'。 – vold

+0

@Thomas我编辑了我的答案,以提供更多期望的输出。 – vold

1

返回您的代码字典,这就是为什么它是突破:

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

你可以做的是使产量本词典是这样的:

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

这会给你的值的新字典是没有中断的href。

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

注意:Spider必须返回Request,BaseItem,dict或None,请参阅parse function