XPath残缺结果问题还是语句?

2024-09-27 23:20:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在这个:http://www.baseball-reference.com/teams/BOS/2013.shtml网页上刮“团队击球”表。我有两个问题。在

  1. 我只得到34级的玩家等级,而不是43级。我不知道为什么会这样。代码中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()

谢谢!在


Tags: 代码textidstatscounttable玩家extract
1条回答
网友
1楼 · 发布于 2024-09-27 23:20:53

第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]对结果进行切片。所以你只能得到部分结果。在

^{pr2}$

问题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()
    ...

相关问题 更多 >

    热门问题