2014-07-13 71 views
1

我在Vista 64位上使用Python.org版本2.7 64位。我有當前的Scrapy代碼,現在工作得很好,現在可以提取文本,但是我對如何從網站上的表格獲取數據感到困惑。我在網上查看了答案,但我仍然不確定。舉個例子,我想獲得此表中包含了魯尼的進球統計數據:嘗試使用Scrapy從表中提取數據

http://www.whoscored.com/Players/3859/Fixtures/Wayne-Rooney 我目前擁有的代碼是這樣的:

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']) 

什麼語法確實需要在使用xpath()語句來獲取表格數據?

感謝

+0

你想從頁面中獲得什麼 –

+0

@PadraicCunningham在文本'Wayne Rooney的比賽歷史記錄'下面看起來像是一個表格的數據:'...我查看了一些在線的xpath示例,但沒有一個似乎在這種情況下返回任何東西。我按F12來檢查頁面結構,但我不確定我在看什麼。 – gdogg371

回答

2

我剛纔看到的網頁鏈接,我得到了你想要整個XPath表達式錦標賽的表的所有行:'//table[@id="player-fixture"]//tr[td[@class="tournament"]]'

我會盡力解釋這個XPath表達式的各個部分:

  • //table[@id="player-fixture"]:檢索與id屬性player-fixture整個表,你可以在頁面檢查。
  • //tr[td[@class="tournament"]]:用你想要的每個匹配的信息檢索所有行。

也可以使用這個較短的//tr[td[@class="tournament"]] Xpath表達式。但是我認爲使用前面的表達式更加一致,因爲您在該表達式中聲明您希望某個表的id是唯一的(player-fixture)下的所有行(tr)。

一旦你得到所有的行,你可以遍歷它們從每一行條目中獲取你需要的所有信息。

+0

嗨,謝謝你的回覆。使用上面的示例,除了包含目標和輔助數據的列之外,我從該表中獲取所有信息,因爲它們不表示爲文本。你知道我可以如何將它們包含在我的輸出中作爲我可以轉換成像「目標」和「輔助」這樣的文本的東西嗎? – gdogg371

+0

@ user3045351嗨,我決定在下一個答案中回答你的疑問,而不是在這裏發表評論。 –

0

要抓取數據,通常需要識別表格,然後遍歷行。 像這樣的HTML表通常具有以下格式:

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

這裏有一個如何解析這個固定表的例子:

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")和環比數據行結果,然後提取數據。

編輯: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.items導入夾具',兩者都不工作? – gdogg371

0

在首先爲你想,你必須知道什麼是名關聯帶有此標誌的每個符號。例如,對於目標,我看到標題屬性爲「目標」以及標題屬性爲「Assist」元素的<span>元素爲符號助手。

考慮到這些信息,您可以檢查檢索到的每一行,如果它包含與想要檢索的符號關聯的想要的標題名稱的範圍。

要獲得所有目標行的符號使用的表達//span[@title="Goal"爲波紋管,你可以EVAL該行:如果它已檢索的沒有空列表

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. 
    . 
    . 
    . 

,這意味着有目標,該行內部的符號。因此,您可以輸出多少目標文本的數量與上面返回的跨度列表的長度一樣多。

+0

你把'#output目標文本'放在'print list_of_goals'中,並且出現以下錯誤:'Traceback(最近呼叫最後一個): 文件「c:\ Python27 \ lib \ site-packages \ twisted \ internet文件「c:\ Python27 \ lib \ site-packages \ twisted \ internet \ base.py」,行824,在runUntilCurrent中 call.func() * call.args,** call.kw) 在回調中的文件「c:\ Python27 \ lib \ site-packages \ twisted \ internet \ defer.py」,第383行 self._startRunCallbacks(result) – gdogg371

+0

文件「c :\ Python27 \ lib \ site-packages \ twisted \ internet \ defer.py「,第491行,在_startRunCallbacks中 self._runCallbacks() --- <此處捕獲的異常> --- 文件」c:\ Pyt hon27 \ lib \ site-packages \ twisted \ internet \ defer.py「,第578行,在_runCallbacks中 current.result = callback(current。結果,* args,** kw) 文件「c:\ Python27 \ lib \ site-packages \ scrapy \ spider.py」,第56行,解析 raise NotImplementedError exceptions.NotImplementedError:'...我有什麼做錯了? – gdogg371

相關問題