【问题标题】:Python Parsing with lxml使用 lxml 进行 Python 解析
【发布时间】:2016-05-13 22:44:57
【问题描述】:

我为 NFL 逐场比赛数据创建了以下 scraper。它将结果写入 csv 文件并执行我需要的所有操作,除非我不知道如何在 csv 文件的每一行中附加一列,说明谁实际拥有球。
我可以从“home”和“away”<tr> 标记中获取文本,以显示谁在玩游戏以供稍后查询,但我需要 scraper 来识别所有权何时发生变化(去从家到外,反之亦然)。我对 Python 还很陌生,并且尝试过不同的缩进,但我认为这不是问题所在。任何帮助将不胜感激。我觉得答案超出了我的理解范围。

我也意识到我的代码可能不是最 Pythonic 的,但我仍在学习。我正在使用 Python 2.7.9。

import lxml
from lxml import html
import csv
import urllib2
import re

game_date = raw_input('Enter game date: ')

data_html = 'http://www.cbssports.com/nfl/gametracker/playbyplay/NFL_20160109_PIT@CIN'

url = urllib2.urlopen(data_html).read()

data = lxml.html.fromstring(url)


plays = data.cssselect('tr#play')
home = data.cssselect('tr#home')
away = data.cssselect('tr#away')

csvfile = open('C:\\DATA\\PBP.csv', 'a')
writer = csv.writer(csvfile)

for play in plays:

    frame = []
    play = play.text_content()

    down = re.search(r'\d', play)
    if down == None:
        pass
    else:
        down = down.group()

    dist = re.search(r'-(\d+)', play)
    if dist == None:
        pass
    else:
        dist = dist.group(1)

    field_end = re.search(r'[A-Z]+', play)

    if field_end == None:
        pass
    else:
        field_end = field_end.group()

    yard_line = re.search(r'[A-Z]+([\d]+)', play)

    if yard_line == None:
        pass
    else:
        yard_line = yard_line.group(1)

    desc = re.search(r'\s(.*)', play)
    if desc == None:
        pass
    else:
        desc = desc.group()

    time = re.search(r'\((..*\d)\)\s', play)
    if time == None:
        pass
    else:
        time = time.group(1)

    for team in away:
        teamA = team.text_content()
        teamA = re.search(r'(\w+)\s', teamA)
        teamA = teamA.group(1)
        teamA = teamA.upper()

    for team in home:
        teamH = team.text_content()
        teamH = re.search(r'(\w+)\s', teamH)
        teamH = teamH.group(1)
        teamH = teamH.upper()

    frame.append(game_date)
    frame.append(down)
    frame.append(dist)
    frame.append(field_end)
    frame.append(yard_line)
    frame.append(time)
    frame.append(teamA)
    frame.append(teamH)
    frame.append(desc)

    writer.writerow(frame)

csvfile.close()

【问题讨论】:

  • 我在解释我想要的东西方面做得很糟糕,所以我很抱歉。当 for 循环遍历列表时,我希望它在遇到“home”标签时返回主队名称。然后继续返回主队名称,直到遇到“客场”标签。然后为客队做同样的事情。希望这能让它更清楚一点。

标签: python html parsing csv lxml


【解决方案1】:

我猜你需要为每一行附加另一个值到框架中,这表明所有权是否发生了变化。

之后:

frame.append(desc)

添加:

if teamA == teamH:
    frame.append("Same possession")
else:
    frame.append("Changed possession")

(请注意,这假设团队名称是一致的,在 teamA/teamH 值中没有额外的空格/填充/格式)。

您不必使用字符串,例如,您可以输入 0 表示不改变,输入 1 表示改变所有权。

HTH 巴尼

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多