Python - 将HTML序列化并输出为JSON

0 投票
1 回答
9726 浏览
提问于 2025-04-16 15:27

我有一个HTML页面,上面显示了一些值。同时,我还有一个小应用程序,可以显示我其他页面的数据,但那些页面是JSON格式的,不是HTML。

我想从这个HTML页面获取这些值,把它们转换成JSON格式,然后输出。

这样做的原因是我可以简单地重用我的代码,只需要更改网址,或者甚至动态生成网址。

我把HTML页面做得尽量简单,以便去掉所有多余的东西,这样正则表达式就可以更简单。

这是我的HTML:

<div class="BlockA">
    <h4>BlockA</h4>
    <div class="name">John Smith</div>
    <div class="number">2</div>
    <div class="name">Paul Peterson</div>
    <div class="number">14</div>
</div>

<div class="BlockB">
    <h4>BlockB</h4>
    <div class="name">Steve Jones</div>
    <div class="number">5</div>
</div>

这两个代码块的元素数量会根据一些因素而有所不同。

这是我的Python代码:

def index(request, toGet="xyz"):
    file = urllib2.urlopen("http://www.mysite.com/mypage?data="+toGet)
    data = file.read()
    dom = parseString(data)
    rows = dom.getElementsByTagName("BlockA")[0]
    readIn = ""
    for row in rows:
        readIn = readIn+json.dumps(
            {'name': row.getAttribute("location"),
            'number': row.getAttribute("number")},
            sort_keys=True,
            indent=4)+","
    response_generator = ( "["+readIn[:-1]+"]" )
    return HttpResponse(response_generator)

基本上,这段代码是读取这些值(实际上,这里的源是XML),然后循环遍历它们,最后输出所有的值。

如果有人能给我指个方向,我会非常感激。例如,如何读取像“BlockA”这样的标签,然后再读取“name”和“number”这些标签。

谢谢。

1 个回答

2

如果你真的需要在Python中解析一个HTML页面,建议你使用Beautiful Soup这个工具。不过我有点怀疑你是否真的需要这样做。你要解析的HTML页面和JSON输出是用同一个Django实例生成的吗?它们都是同一个项目的一部分吗?

如果它们确实是同一个项目的一部分,那么你可以使用像django-piston这样的工具,它是一个为Python设计的RESTful框架。这个框架可以让你定义哪些数据需要被公开,并且可以输出成多种格式,比如HTML/Django模板、JSON、XML或YAML。你还可以创建自己的输出方式,以便输出成其他格式。

这样的话,你就可以把一个特定的URL当作普通模板来使用,或者获取相同的数据以JSON格式输出,这样解析起来会比HTML简单得多。

如果我误解了你的问题,真是抱歉。不过听起来你确实想把一个视图以多种不同格式公开,而使用RESTful框架会对你有帮助。

撰写回答