2014-05-16 4 views
1

앵커 태그의 특정 텍스트가있는 href 속성에서 URL을 추출해야합니다. 나는 또한 시도Xpath를 사용하여 앵커 태그의 텍스트를 href로 추출합니다.

item['team_stats_link'] = site.xpath('//a[text()='Stats']/@href').extract() 

: 문제

item['team_stats_link'] = site.xpath('//a[contains(text(), 'Stats')]/@href).extract() 

웹 사이트 : 내부 http://espn.go.com/nba/teams

+0

'site.xpath ('// [text() ='Stats ']/@ href')'는 Python 구문 오류입니다. 작은 따옴표를 살펴보십시오. – Tomalak

+0

아! 이 모든 시간. 도와 주셔서 감사합니다. – user1636797

답변

1

당신의 XPath는

from scrapy.spider import Spider 
from scrapy.selector import Selector 
from nba.items import NBAItem 

class ESPNSpider(Spider): 
    name = "ESPN" 
    allowed_domains = ["espn.com"] 
    start_urls = ["http://espn.go.com/nba/teams"] 

def parse(self, response): 
    sel = Selector(response) 
    sites = sel.xpath('//*[@id="content"]/div[3]/div[1]') 
    items = [] 
    for site in sites: 
     item = NBAItem() 
     item['team_name'] = site.xpath('//a[@class="bi"]/text()').extract() 
     item['team_link'] = site.xpath('//a[@class="bi"]/@href').extract() 
     item['team_stats_link'] = site.xpath('//a[text()='Stats']/@href').extract() 
     items.append(item) 
    return items 

내가에 문제가 오전 라인 루프는 .//으로 시작해야합니다. 즉, 다시 만들 필요가 있습니다. site로 이동하십시오.

내가 대신 content ID로 div 내부의 세 번째 div 내부의 첫번째 div를 검색하는 ulmedium-logos와 클래스 내부 li 태그를 통해 갈 것 :

class ESPNSpider(Spider): 
    name = "ESPN" 
    allowed_domains = ["espn.com"] 
    start_urls = ["http://espn.go.com/nba/teams"] 

    def parse(self, response): 
     sel = Selector(response) 
     sites = sel.xpath('//ul[@class="medium-logos"]//li') 
     for site in sites: 
      item = NBAItem() 
      item['team_name'] = site.xpath('.//a[@class="bi"]/text()').extract()[0] 
      item['team_link'] = site.xpath('.//a[@class="bi"]/@href').extract()[0] 
      item['team_stats_link'] = site.xpath(".//a[text()='Stats']/@href").extract()[0] 
      yield item 

그것은 생산 :

{'team_link': u'http://espn.go.com/nba/team/_/name/bos/boston-celtics', 'team_name': u'Boston Celtics', 'team_stats_link': u'/nba/teams/stats?team=bos'} 
{'team_link': u'http://espn.go.com/nba/team/_/name/bkn/brooklyn-nets', 'team_name': u'Brooklyn Nets', 'team_stats_link': u'/nba/teams/stats?team=bkn'} 
... 
+0

상대 경로와 함께 갈 이유가 무엇인지 설명해 주시겠습니까? 또한 'bi' 클래스가 아닌'medium-logos' 클래스를 사용하는 이유는 무엇입니까? – user1636797

+0

@ user1636797 팀의'name'과'link'를 찾기 위해'bi'를 사용합니다. 전체 페이지가 아닌 팀 블록 내에서 검색 할 수 있도록 페이지를 상대적으로 만들어야합니다. 희망이 도움이됩니다. – alecxe

+0

무슨 뜻인지 알 겠어. 고맙습니다! – user1636797

관련 문제