1

http://www.baseball-reference.com/teams/BOS/2013.shtml Web ページの「チーム バッティング」テーブルをスクレイピングしようとしています。私は2つの問題を抱えています。

  1. プレーヤーのランクが合計 43 ではなく、34 までしか上がりません。なぜこれが起こっているのかわかりません。34 から 35 までのコードでは何も変わらないように見えます。
  2. プレーヤーの位置は DH にのみ移動し、最初の DH の後の全員に同じ位置を与えて、それをもう一度繰り返します。最初の 10 ポジションには「強い」タグが付いているので、「強い」と「強くない」の両方を行う OR ステートメントを作成しました。どうやらそれはうまくいきませんでした。

XPATH コードは次のとおりです。

    item ['rank'] = stats.select('//table[@id="team_batting"]/tbody/tr/td[1]/text()')[count].extract()
    item ['position'] = stats.select(('//table[@id="team_batting"]/tbody/tr/td[2]/strong/text()') or ('//table[@id="team_batting"]/tbody/tr/td[2]/text()'))[count].extract()
    item ['name'] = stats.select('//table[@id="team_batting"]/tbody/tr/td[3]/a/text()')[count].extract()

ありがとう!

4

1 に答える 1

2

問題 1:

あなたの XPath は正しく、私はそれをテストし、43 個のノードすべてを取得しました。

>>> res = hxs.select('//table[@id="team_batting"]/tbody/tr/td[1]/text()').extract()
>>> res
[u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'10', u'11', u'12', u'13', u'14', u'15', u'16', u'17', u'18', u'19', u'20', u'21', u'22', u'23', u'24', u'25', u'26', u'27', u'28', u'29', u'30', u'31', u'32', u'33', u'34', u'35', u'36', u'37', u'38', u'39', u'40', u'41', u'42', u'43']
>>> len(res)
43

結果を でスライスすると 34 になると思います[count]。したがって、結果の一部しか取得できません。

>>> len(hxs.select('//table[@id="team_batting"]/tbody/tr/td[1]/text()')[:34].extract())
34

問題 2:

そのようなものはor確かに機能しません。XPath を少し変更するだけで、強いかどうかを気にせずにテキストを取得できます。

>>> res = hxs.select('//table[@id="team_batting"]/tbody/tr/td[2]//text()').extract()
                                                                 ^

//の代わりに使用し/ます。これにより、すべての子孫テキスト ノードが取得されます。結果を見ることができます:

>>> res
[u'C', u'1B', u'2B', u'SS', u'3B', u'LF', u'CF', u'RF', u'DH', u'OF', u'IF', u'UT', u'C', u'OF', u'UT', u'3B', u'UT', u'UT', u'IF', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P', u'P']
>>> len(res)
43

私が使用するスニペット:

>>> import urllib2
>>> from scrapy.selector import HtmlXPathSelector
>>> f = urllib2.urlopen('http://www.baseball-reference.com/teams/BOS/2013.shtml')
>>> hxs = HtmlXPathSelector(text=f.read())
>>> rank = hxs.select('//table[@id="team_batting"]/tbody/tr/td[1]/text()').extract()
>>> position = hxs.select('//table[@id="team_batting"]/tbody/tr/td[2]//text()').extract()
>>> name = hxs.select('//table[@id="team_batting"]/tbody/tr/td[3]/a/text()').extract()

編集:

hxs = HtmlXPathSelector(text=f.read())
divs = hxs.select('//div[@class="table_container"]')
for div in divs:
    table = div.select('./table')
    item['rank'] = table.select('./tbody/tr/td[1]/text()').extract()
    ...
于 2013-08-07T05:15:56.600 に答える