2014-07-13 2 views
1

Vista 64 비트에서 Python.org 버전 2.7 64 비트를 사용하고 있습니다. 텍스트를 추출하는 데 현재 잘 작동하는 현재 Scrapy 코드가 있지만 웹 사이트의 테이블에서 데이터를 얻는 방법에 대해서는 조금 꼼짝도하지 않습니다. 나는 온라인으로 해답을 찾았지만 여전히 확실하지 않다. 예를 들어, 나는 웨인 루니의 goalscoring 통계이 테이블에 포함 된 데이터 좀하고 싶습니다 :Scrapy를 사용하여 테이블에서 데이터를 추출하려고합니다.

from scrapy.spider import Spider 
from scrapy.selector import Selector 
from scrapy.utils.markup import remove_tags 
from scrapy.cmdline import execute 
import re 


class MySpider(Spider): 
    name = "Goals" 
    allowed_domains = ["whoscored.com"] 
    start_urls = ["http://www.whoscored.com/Players/3859/Fixtures/Wayne-Rooney"] 

    def parse(self, response): 
     titles = response.selector.xpath("normalize-space(//title)") 
     for titles in titles: 

      body = response.xpath("//p").extract() 
      body2 = "".join(body) 

      print remove_tags(body2).encode('utf-8') 

execute(['scrapy','crawl','goals']) 

은 무엇 구문에 사용할 필요합니까 :

http://www.whoscored.com/Players/3859/Fixtures/Wayne-Rooney 내가 현재 가지고있는 코드는이가 표 형식의 데이터를 얻기위한 xpath() 문

감사

+0

무엇을 얻으려고합니까? –

+0

@PadraicCunningham 'Wayne Rooney 's Match History :'테이블 아래에 보이는 데이터가 있습니다. ... 온라인에서 일부 xpath 예제를 보았지만 아무 것도 없었습니다. 이 경우에는 아무것도 반환하지 않는 것 같습니다. 페이지 구조를 조사하기 위해 F12 키를 눌렀지만 실제로 무엇을보고 있는지 잘 모르겠습니다. – gdogg371

답변

2

난 그냥 페이지 링크를보고 난 당신이 XPath 식을 통해 원하는 경기 대회의 테이블의 모든 행을 가지고 : '//table[@id="player-fixture"]//tr[td[@class="tournament"]]'합니다.

  • //table[@id="player-fixture"]을 :

    나는이 XPath 식의 각 부분을 설명하려고합니다 해당 페이지에서 검사 할 수있는 id 속성 player-fixture와 전체 테이블을 검색 할 수 있습니다.

  • //tr[td[@class="tournament"]] : 원하는 모든 일치 정보로 모든 행을 검색하십시오.

//tr[td[@class="tournament"]] Xpath 표현식도 사용할 수 있습니다. 하지만 나는 그 표현으로 말한 것처럼 이전 표현을 사용하는 것이 더 일관성이 있다고 생각합니다. id이 고유 한 특정 테이블 (tr) 아래의 모든 행 (tr)을 원한다고 가정합니다 (player-fixture).

모든 행을 가져온 후에는 반복하여 각 행 항목에서 필요한 모든 정보를 얻을 수 있습니다.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 위의 예제를 사용하여 테이블의 모든 정보를 목표가 포함 된 열과 별도로 가져오고 텍스트로 표시되지 않으므로 데이터를 지원합니다. 당신은 내가 '목표'와 '도움'과 같은 텍스트로 변환 할 수있는 것으로 내 산출물에 포함시킬 수있는 방법을 알고 있습니까? – gdogg371

+0

@ user3045351 안녕하세요, 저는 여기에 대한 의견 대신에 다음 답변에서 의심스럽게 대답하기로 결정했습니다. –

0

데이터를 스크래핑하려면 대개 테이블을 식별 한 다음 행을 반복하십시오.

from scrapy.spider import Spider 
from scrapy.http import Request 
from myproject.items import Fixture 

class GoalSpider(Spider): 
    name = "goal" 
    allowed_domains = ["whoscored.com"] 
    start_urls = (
     'http://www.whoscored.com/', 
     ) 

    def parse(self, response): 
     return Request(
      url="http://www.whoscored.com/Players/3859/Fixtures/Wayne-Rooney", 
      callback=self.parse_fixtures 
     ) 

    def parse_fixtures(self,response): 
     sel = response.selector 
     for tr in sel.css("table#player-fixture>tbody>tr"): 
      item = Fixture() 
      item['tournament'] = tr.xpath('td[@class="tournament"]/span/a/text()').extract() 
      item['date'] = tr.xpath('td[@class="date"]/text()').extract() 
      item['team_home'] = tr.xpath('td[@class="team home "]/a/text()').extract() 
      yield item 

는 첫째, 나는 이상 sel.css("table#player-fixture>tbody>tr") 및 루프 데이터 행을 식별 : 여기

<table id="thistable"> 
    <tr> 
    <th>Header1</th> 
    <th>Header2</th> 
    </tr> 
    <tr> 
    <td>data1</td> 
    <td>data2</td> 
    </tr> 
</table> 

이 고정 테이블을 분석하는 방법의 예이다 : 이와 같은 HTML 테이블은 일반적으로이 형식은 결과를 추출한 다음 데이터를 추출하십시오.

편집 : items.py 당신은이 기호와 이름 연관이 무엇인지 알고 있어야 할 각 기호에 대한 모든의 처음에 (http://doc.scrapy.org/en/latest/topics/items.html)

class Fixture(Item): 
    tournament = Field() 
    date = Field() 
    team_home = Field() 
+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 위의 모듈 'myproject.item'은 무엇입니까? myproject는 나에게 로컬 이름을 나타 내기로되어 있습니까? 아니면 특별히 'myproject'라고 불리는 모듈이 필요합니까? – gdogg371

+0

myproject는 프로젝트의 이름입니다. 그래서 당신이'scrapy startproject newproject'를한다면, 모듈은 newproject라고 불릴 것입니다. 이렇게하면 sys를 사용하지 않고도 myproject/myproject 폴더의 모든 항목에 액세스 할 수 있습니다. –

+0

내 프로젝트는 test라고 불리 웠으므로 'test import fixture'와 'test.items import fixture'둘 중 어느 것을 시도해 보았습니까? – gdogg371

0

. 예를 들어 목표의 경우 제목 속성이 "목표"이고 제목 속성이 <span> 요소가 있고 기호 보조를 위해<span> 요소를 보았습니다.

이러한 정보를 고려하면 검색 할 기호와 관련된 원하는 제목 이름이있는 범위가 있으면 검색된 각 행을 확인할 수 있습니다.그것은이 행 내부 목표 문자가 의미

for row in response.selector.xpath(
      '//table[@id="player-fixture"]//tr[td[@class="tournament"]]'): 
    # Is this row contains goal symbols? 
    list_of_goals = row.xpath('//span[@title="Goal"') 
    if list_of_goals: 
     # Output goals text. 
    . 
    . 
    . 

을 그것이 빈 목록을 검색되지 않은 경우 :

은 벨으로 표현 //span[@title="Goal"를 사용하여이 행을 평가 후면 수있는 모든 목표를 행의 문자를 얻으려면. 따라서 위에 나온 반환 범위 목록의 길이만큼 텍스트의 목표 수를 출력 할 수 있습니다.

+0

'#output goals text'를 입력했는데 'list_of_goals'라는 인쇄물을 넣었습니다. 'Traceback (가장 최근에 마지막으로 호출) : 파일 "c : \ Python27 \ lib \ site-packages \ twisted \ internet \ base.py ", line 1201, mainLoop에서 self.runUntilCurrent() runUntilCurrent의 파일"c : \ Python27 \ lib \ site-packages \ twisted \ internet \ base.py ", 824 줄, call.func * call.args, ** call.kw) 파일 "c : \ Python27 \ lib \ site-packages \ twisted \ internet \ defer.py"콜백 의 383 행 self._startRunCallbacks (결과) – gdogg371

+0

파일 "c :self._runCallbacks() --- <예외가 여기에 있습니다> --- 파일 "c : \ Pyt : \ Python27 \ lib \ site-packages \ twisted \ internet \ defer.py", 줄 491, _startRunCallbacks hon27 \ lib \ site-packages \ twisted \ internet \ defer.py ", 줄 578, _runCallbacks에 current.result = 콜백 (현재.결과, * args, ** kw) 파일 "c : \ Python27 \ lib \ site-packages \ scrapy \ spider.py"구문 5635, 구문 분석에서 raise NotImplementedError exceptions.NotImplementedError : '... 무엇이 있습니까? 잘못 했니? – gdogg371

관련 문제