-1

我最近跳入了 python,并在类似脚本的帮助下,想“抓取”并解析我所在地区的通勤列车信息。

问题是,我得到的信息是一大块已经排序和标记的指示,但是尽管我进行了搜索(并且由于我的编程水平不佳),但我似乎无法找到消化它的方法。

你可以找到我在这里得到的一个例子。

我的“代码”目前看起来像什么:

import urllib
sock = urllib.urlopen("http://sncf.mobi/infotrafic/iphoneapp/transilien/?gare=BEC")
htmlSource = sock.read()
sock.close()
o = htmlSource
print o

理想的情况是能够轻松地处理每辆火车的信息,将它们与各自的车站、类型等结合起来。

非常感谢,如果我能做些什么来改进我的提交,我会很乐意这样做。

4

3 回答 3

2

由于您链接到的页面包含 JSON 而不是 HTML,因此我建议使用json模块对其进行解析。你可以这样做:

from urllib.request import urlopen
import json

with urlopen('http://sncf.mobi/infotrafic/iphoneapp/transilien/?gare=BEC') as sock:
    information = json.loads(sock.read().decode('utf-8'))

然后information在 Python 字典中包含页面上的所有信息。

于 2013-06-10T23:10:43.810 回答
2

如前所述,响应是 JSON 格式的。Python 自带了一个解析 JSON 的库,所以你只需要使用它来获得一个很好的 dicts、lists 和 strings 结构:

import urllib
import json

response = urllib.urlopen("http://sncf.mobi/infotrafic/iphoneapp/transilien/?gare=BEC")
if response.getcode() == 200:
    data = json.load(response)
    for train in data["D"]:
        print "Train number", train["numerotrain"], "code", train["codevoyageur"]
else:
    print "Failed to load data:", response.getcode()
于 2013-06-10T23:06:16.467 回答
0

如果包装器总是D或者你知道包装器是什么......

import json

class Trains:
    def __init__(self, data, wrapper='D'):
        self.data = data[wrapper]

    def get_train_by_number(self, num):
        for i in self.data:
            if int(i['numerotrain']) == num: return i
        return None

# your code to pull http://sncf.mobi/infotrafic/iphoneapp/transilien/?gare=BEC

data = json.loads(response)
trains = Trains(data)

# get train number 134741
train = trains.get_train_by_number(134741)

print train['heureprobable'] # prints 11/06/2013 00:54
于 2013-06-10T23:12:47.170 回答