2017-12-22 40 views
1

次のコードでは、scrapy + scrapy-splash + Pythonを使用しています。 https://www.hltv.org/matchesXpathが<table>の内容を<a>に返さない(<tbody>は問題ありません)

コールバック「パース」関数での私のコードは次のとおりです:

match_days = response.xpath("//div[@class = 'upcoming-matches']//div[@class = 'match-day']") 
    for match in match_days.xpath("./a"): 
     print(match.extract()) 
     # tournament_name = match.xpath(".//td[@class='event']//span[@class='event-name']/text()").extract_first() 
     # team1_name = match.xpath(".//td[@class='team-cell'][1]//div[@class='team']/text()").extract_first() 

それをこのサイトから:(開始時間、チーム名、大会名が含まれます) 私は今度の試合を抽出しようとしています(すべての「<>」要素のために私の内容を取得することになっている、すなわち、この例のようになります:

<a href="/matches/2318355/dkiss-vs-psychoactive-prowince-winner-winner-of-the-future-2017" class="a-reset block upcoming-match standard-box" data-zonedgrouping-entry-unix="1514028600000"> 
 
    <table class="table"> 
 
     <tbody> 
 
     <tr> 
 
      <td class="time"> 
 
       <div class="time" data-time-format="HH:mm" data-unix="1514028600000">12:30</div> 
 
      </td> 
 
      <td class="team-cell"> 
 
       <div class="line-align"> 
 
        <img alt="DKISS" src="https://static.hltv.org/images/team/logo/8657" class="logo" title="DKISS"> 
 
        <div class="team">DKISS</div> 
 
       </div> 
 
      </td> 
 
      <td class="vs">vs</td> 
 
      <td class="team-cell"> 
 
       <div class="team">PSYCHOACTIVE/proWince winner</div> 
 
      </td> 
 
      <td class="event"><img alt="Winner of the Future 2017" src="https://static.hltv.org/images/eventLogos/3464.png" class="event-logo" title="Winner of the Future 2017"><span class="event-name">Winner of the Future 2017</span></td> 
 
      <td class="star-cell"> 
 
       <div class="map-text">bo3</div> 
 
      </td> 
 
     </tr> 
 
     </tbody> 
 
    </table> 
 
</a>

しかし、私は唯一の各 "<>" のためにこれを取得する:

<a href="/matches/2318355/dkiss-vs-psychoactive-prowince-winner-winner-of-the-future-2017" class="a-reset block upcoming-match standard-box" data-zonedgrouping-entry-unix="1514028600000"> 
 
</a>

私はscrapyシェルと同じ結果でこれを試してみました。

私はChromeデベロッパーツールを試しましたが、innerHTMLプロパティの各 "<>"のすべてのコンテンツを見ることができます。

「< tbody>」の問題はないと私は理解しています。一部のケースでは省略され、Webブラウザによって追加されたことがわかりました。なぜなら、返されたページのHTMLコンテンツを"< tbody>"があります(ちなみに、私はscrapy-splashでURLをPOSTリクエストしてhtmlページを取得するためにluaスクリプトを使用します)

これはなぜ起こっているのですか? ?私は過去2〜3日を無回答で過ごしました。また、どうしてこのようなことが起こってはいけないのかを理解するために、何を試すべきかについて私は考えていません。

ありがとうございます。

答えて

0

cssセレクタを使用すると、私にとっては簡単でした。

import scrapy 

class MySpider(scrapy.Spider): 

    name = 'myspider' 

    start_urls = ['https://www.hltv.org/matches'] 

    def parse(self, response): 
     print('url:', response.url) 

     days = response.css('.match-day') 

     for day in days: 

      date = day.css('.standard-headline::text').extract_first() 
      print('date:', date) 

      tables = day.css('table') 

      for table in tables: 

       time = table.css('div.time::text').extract_first() 
       teams = table.css('.team::text').extract() 
       event = table.css('.event-name::text').extract_first() 
       placeholder = table.css('.placeholder-text-cell::text').extract_first() 

       print(' time:', time) 
       if teams: 
        print(' teams 1:', teams[0]) 
        print(' teams 2:', teams[1]) 
        print(' event:', event) 
       else: 
        print(' placeholder:', placeholder) 

# --- it runs without project and saves in `output.csv` --- 

from scrapy.crawler import CrawlerProcess 

c = CrawlerProcess({ 
    'USER_AGENT': 'Mozilla/5.0', 
    # save in file as CSV, JSON or XML 
    'FEED_FORMAT': 'csv',  # csv, json, xml 
    'FEED_URI': 'output.csv', # 
}) 
c.crawl(MySpider) 
c.start() 

返事が遅れて申し訳ありません結果

url: https://www.hltv.org/matches 

date: 2017-12-24 
    time: 03:00 
    teams 1: NSPR 
    teams 2: MiTH 
    event: WESG 2017 Thailand LAN 
    time: 06:00 
    teams 1: Signature 
    teams 2: Beyond 
    event: WESG 2017 Thailand LAN 
    time: 09:00 
    placeholder: WESG Thailand - Grand Final 
    time: 10:00 
    teams 1: DKISS 
    teams 2: Izako Boars 
    event: Winner of the Future 2017 
date: 2017-12-26 
    time: 14:00 
    teams 1: Recca 
    teams 2: Signature 
    event: GOTV.GG Invitational #1 
    time: 17:00 
    teams 1: AGO 
    teams 2: Vega Squadron 
    event: LOOT.BET Cup 2 
    time: 20:00 
    teams 1: mousesports 
    teams 2: Spirit 
    event: LOOT.BET Cup 2 
date: 2017-12-27 
    time: 12:00 
    teams 1: Singularity 
    teams 2: GoodJob 
    event: CSesport.com XMAS Cup 
    time: 13:00 
    placeholder: GOTV.GG - Semi-Final #1 
    time: 15:00 
    placeholder: GOTV.GG - Semi-Final #2 
    time: 15:00 
    teams 1: MANS NOT HOT 
    teams 2: VenatoreS 
    event: CSesport.com XMAS Cup 
    time: 17:00 
    teams 1: Heroic 
    teams 2: Valiance 
    event: LOOT.BET Cup 2 
date: 2017-12-28 
    time: 13:00 
    placeholder: GOTV.GG - 3rd place decider 
    time: 15:00 
    placeholder: GOTV.GG - Grand Final 
+0

。はい、これは完全に動作します。私はCSSの代わりにXpathで書き直しました。しかし、私はまだあなたが 'テーブル'要素を反復する必要がある理由を理解しておらず、 'a'要素(すなわち "tables = day.css( 'table')"を "tables = day.css( 'a')は結果に出力するすべての変数に "None"を返します。 – Vasko

+0

ブラウザでソースコードをチェックすると、 'a'の中に' table'がありますので、しかし、 'print(day.extract())'をチェックすると、 'a'は空で' table'は 'a'の中ではなく' a'の後にはありません。いくつかのオプション(ヘッダ、クッキー)が不完全な場合や、HTMLが正しく構築されておらず、ブラウザがそれをスクラピーとは異なる方法で解釈した場合、ページは異なるHTMLを送信するかもしれません。 – furas

関連する問題