python - 如何解析HTML表格

2 投票
2 回答
3881 浏览
提问于 2025-04-17 02:03

我有一个HTML页面,上面大约有50个表格。每个表格的布局都是一样的,但里面的数值不同,比如:

<table align="right" class="customTableClass">
<tr align="center">
<td width="25" height="25" class="usernum">value1</td>
<td width="25" height="25" class="usernum">value2</td>
<td width="25" height="25" class="usernum">value3</td>
<td width="25" height="25" class="usernum">value4</td>
<td width="25" height="25" class="usernum">value5</td>
<td width="25" height="25" class="usernum">value6</td>
<td width="25" height="25" class="totalnum">otherVal</td>
</tr>
</table>

我的REST服务器是用django/python搭建的,所以在我的urls.py文件里,我调用了def parse_url():这个函数,我希望在这个函数里完成所有的工作。不过,我对python还是个新手,真的不知道该把我的代码放在哪里。我从HTMLParser的python文档里找了一些代码,并做了如下修改:

import urllib, urllib2
from django.http import HttpResponse
from HTMLParser import HTMLParser

    class MyHTMLParser(HTMLParser):
        def handle_starttag(self, tag, attrs):
            print "Encountered the beginning of a %s tag" % tag

        def handle_endtag(self, tag):
            print "Encountered the end of a %s tag" % tag

        def handle_data(self, data):
            HttpResponse("Encountered data %s" % data)


    def parse_url(request):
        p = MyHTMLParser()
        url = 'http://www.mysite.com/lists.asp'
        content = urllib.urlopen(url).read()
        p.feed(content)
        return HttpResponse('DONE')

目前这段代码并没有输出任何有用的信息。它只打印了DONE,这并没有什么用。

我该如何使用像handle_starttag()这样的类方法呢?难道在我使用p.feed(content)的时候,这些方法不会自动被调用吗??

基本上,我想实现的目标是,当我访问mysite.com/showlist时,能够输出一个列表,内容是:

value1
value2
value3
value4
value5
value6

othervalue

这需要在一个循环中完成,因为大约有50个表格,每个表格里的值都不同。

谢谢你们帮助一个初学者!!

2 个回答

5

看看这个叫做 BeautifulSoup 的工具,点击这里可以找到它的文档 http://www.crummy.com/software/BeautifulSoup/documentation.html

另外,它会更加灵活,能够满足未来的需求哦!

5

你现在打印的是答案的开头,而不是django的内容。下面是如何让HTMLParser按照你的要求工作的:

import urllib, urllib2
from django.http import HttpResponse
from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):
    def __init__(self, *args, **kwargs):
        self.capture_data = False
        self.data_list = []
        HTMLParser.__init__(self, *args, **kwargs)

    def handle_starttag(self, tag, attrs):
        if tag == 'td':
            self.capture_data = True

    def handle_endtag(self, tag):
        if tag == 'td':
            self.capture_data = False

    def handle_data(self, data):
        if self.capture_data and data and not data.isspace():
            self.data_list.append(data)

def parse_url(request):
    p = MyHTMLParser()
    url = 'http://www.mysite.com/lists.asp'
    content = urllib.urlopen(url).read()
    p.feed(content)
    return HttpResponse(str(p.data_list))

我建议把这个类放到一个utils.py文件里,并和你的views.py放在同一个文件夹里。然后再导入这个类。这样可以让你的views.py更简洁,只包含视图相关的内容。

撰写回答