首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python表中的一些列,但不是所有列

python表中的一些列,但不是所有列
EN

Stack Overflow用户
提问于 2016-01-04 23:33:41
回答 1查看 447关注 0票数 1

不幸的是,我是XPath的初学者,并不完全确定ir是如何工作的。对于我的一个项目,我正在寻找一种解析9列表的5列的方法。以下是我到目前为止所做的工作:

代码语言:javascript
运行
复制
url="".join(["http://www.basketball-reference.com/leagues/NBA_2011_games.html"])

#getting the columns 4-7
page=requests.get(url)
tree=html.fromstring(page.content)
# the //text() is because some of the entries are inside <a></a>s
data = tree.xpath('//table[@id="games"]/tbody/tr/td[position()>3 and position()<8]//text()')

因此,我的解决办法是,只需要得到另一个列表,它只得到第一列,然后在额外的步骤中将两者结合起来,这似乎是没有必要的。

到目前为止我尝试过的XPath

代码语言:javascript
运行
复制
//table[@id="games"]/tbody/tr/td[position() = 1]/text() | //table[@id="games"]/tbody/tr/td[position()>3 and position()<8]//text()

这在某种程度上不包括第一列(日期)。(根据w3schools),\x是连接两个XPath语句的操作符。

这是我现在的完整代码。从现在起,这些数据将被放入两个列表中。

希望我没有做太愚蠢的事,谢谢你的帮助。

代码语言:javascript
运行
复制
from lxml import html
import requests


url="".join(["http://www.basketball-reference.com/leagues/NBA_1952_games.html"])

page=requests.get(url)
tree=html.fromstring(page.content)
reg_data = tree.xpath('//table[@id="games"]/tbody/tr/td[position() = 1]/text() | //table[@id="games"]/tbody/tr/td[position()>3 and position()<8]//text()')
po_data = tree.xpath('//table[@id="games_playoffs"]/tbody/tr/td[position() = 1]/text() | //table[@id="games_playoffs"]/tbody/tr/td[position()>3 and position()<8]//text()')
n=int(len(reg_data)/5)

if int(year) == 2016:   
    for i in range(0,len(reg_data)):
        if len(reg_data[i])>3 and len(reg_data[i+1])>3:
            n = int((i)/5)
            break    

games=[]
for i in range(0,n):
    games.append([])
    for j in range(0,5):
        games[i].append(reg_data[5*i+j])

po_games=[]
m=int(len(po_data)/5)
if year != 2016:
    for i in range(0,m):
        po_games.append([])
        for j in range(0,5):
            po_games[i].append(po_data[5*i+j])

print(games)
print(po_games)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-04 23:55:16

看起来,很多数据都封装在链接(a)标记中,所以当您询问文本节点子节点时,您不会发现任何数据,因为您需要更深一层。

而不是

代码语言:javascript
运行
复制
/text()

代码语言:javascript
运行
复制
//text()

这两个斜杠意味着选择text()节点,这些节点是任何级别上的附件。

还可以将整个表达式组合为

代码语言:javascript
运行
复制
//table[@id="games"]/tbody/tr/td[position() = 1 or (position()>3 and position()<8)]//text()

而不是有两个表情。

我们甚至可以进一步缩短到

代码语言:javascript
运行
复制
//table[@id="games"]//td[position() = 1 or (position()>3 and position()<8)]//text()

但是这个表达式有风险,因为它将获取表中任何位置出现的td元素(条件是它们是第1、4、5、6或7列),而不仅仅是在正文中的行。然而,在你的目标中,这是可行的。

还要注意的是,像[position()=1]这样的表达式是不必要的。你可以把它缩短到[1]。您只需要在需要上下文节点以外的节点的位置时才需要位置函数,或者需要编写更复杂的选择,就像我们需要一个以上的特定索引时一样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34601796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档