从变量Python中提取字符串

时间:2013-09-09 05:29:52

标签: python beautifulsoup

我在对解析后的网址执行''.join(soup.findAll(text=True))之后存储在变量中,我必须根据给出的参数获取学校以及正在玩的人...有些事情如{ {1}}应取得像'Norfolk St. 0-38 Rutgers'这样的分数......我尝试使用re.search(),string.find()等几个函数并解析无法获取的字符预期结果?需要帮助

test.py "norfolk st."

问题是我必须从此网址Norfolk St. 0 - 38 Rutgers Final South Florida 6 - 21 Michigan St. Final Chowan 7 - 47 Charlotte Final SE Louisiana 17 - 38 (24) TCU Final W. Kentucky 20 - 52 Tennessee Final S. Carolina St. 13 - 52 (4) Clemson Final Middle Tenn. St. 20 - 40 North Carolina Final Central Conn. St. 44 - 51 Lehigh Final OT Army 14 - 40 Ball St. Final 获取足球框得分,并且当用户在命令行参数中给出学校名称时,必须转到此URI检查学校名称是否存在超级链接,它必须重定向和获取像这样的盒子分数

http://sports.yahoo.com/college-football/scoreboard/?conf=all

如果游戏正在进行检索的分数应该睡眠指定的秒数,然后检索最新的分数。所以我不知道我必须走哪条路!需要帮助,因为我是python的新手。

2 个答案:

答案 0 :(得分:0)

结构[团队1] [得分] [团队2] [关于游戏的注释]?例如。 [team 1] ='Norfolk St',[team 2] ='0-38',[team 2] ='Rutgers',[关于游戏的注释] ='Final'在原始示例中?

并且:你的目标是在命令行上进入一个团队来检索他们所玩的所有游戏的记录(包括团队和得分)吗?

假设这两件事:我首先尝试按行标记:

lines = your_string.split('\n').
clean_lines = [l.strip() for l in lines]

然后我会建立一个实际游戏列表:

In [8]: games = [clean_lines[i:i+4] for i in xrange(0, len(clean_lines), 4)]

In [9]: games
Out[9]: 
[['Norfolk St.', '0 - 38', 'Rutgers', 'Final'],
 ['South Florida', '6 - 21', 'Michigan St.', 'Final'],
 ['Chowan', '7 - 47', 'Charlotte', 'Final'],
 ['SE Louisiana', '17 - 38', '(24) TCU', 'Final'],
 ['W. Kentucky', '20 - 52', 'Tennessee', 'Final'],
 ['S. Carolina St.', '13 - 52', '(4) Clemson', 'Final'],
 ['Middle Tenn. St.', '20 - 40', 'North Carolina', 'Final'],
 ['Central Conn. St.', '44 - 51', 'Lehigh', 'Final OT'],
 ['Army', '14 - 40', 'Ball St.', 'Final']]

如果您想查找给定团队所玩的所有游戏,您可以遍历游戏列表并检查团队的字符串是否出现在0或2索引中。但是,如果您要多次进行查找,那么构建一个字典会很好,其中键是团队名称,值是他们玩游戏的索引。

希望有所帮助!

答案 1 :(得分:0)

我不打扰正则表达式。根据文本,它看起来像字符串,减去空格,大致遵循并重复这种格式:

thing 1
score
thing 2
"final"

因此,我可以继续,清理字符串,遍历它,并将每组4作为字典的一部分返回。

例如:

def chunk(iterable, n):
    '''chunk([1, 2, 3, 4, 5, 6], 2) -> [[1, 2], [3, 4], [5, 6]]'''
    return [iterable[i:i+n] for i in range(0, len(iterable), n)]

def get_scores(raw):
    clean = [line.strip() for line in raw.split('\n') if line.strip() != '']
    return {thing1: (thing1, score, thing2) for (thing1, score, thing2, _) in chunk(clean, 4)}

然后,你可以这样做:

>>> raw = ''.join(soup.findAll(text=True))
>>> scores = get_scores(raw)
>>> print scores['Norfolk St.']
('Norfolk St.', '0 - 38', 'Rutgers')

如果您希望查找不区分大小写,则可以执行以下操作:

def get_scores(raw):
    clean = [line.strip().lower() for line in raw.split('\n') if line.strip() != '']
    return {thing1: (thing1, score, thing2) for (thing1, score, thing2, _) in chunk(clean, 4)}

如果您希望能够查找'Norfolk St.'或者“罗格斯”并得到相同的结果,你可以这样做:

def get_scores(raw):
    clean = [line.strip().lower() for line in raw.split('\n') if line.strip() != '']
    output = {}
    for (thing1, score, thing2, _) in chunk(clean, 4):
        data = (thing1, score, thing2)
        output[thing1] = data
        output[thing2] = data
    return output