python - 如何解析HTML表

eoi*_*nzy 2 python django rest parsing

我有一个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>
Run Code Online (Sandbox Code Playgroud)

我的REST服务器正在运行django/python所以urls.py我在调用我的def parse_url():函数显然我想要完成所有的工作.我的问题是,当涉及到python时,我几乎是一个新手,所以字面意思就是不知道我的代码放在哪里.我从HTMLParserpython文档中获得了一些代码,并将其更改如下:

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')
Run Code Online (Sandbox Code Playgroud)

此代码目前不会输出任何有用的内容.它只是打印出来DONE,这不是很有用.

我如何使用类方法handle_starttag()?我使用时不应自动调用这些p.feed(content)

基本上,我最终想要完成的是,当我去时mysite.com/showlist,能够输出一个列表说:

value1
value2
value3
value4
value5
value6

othervalue
Run Code Online (Sandbox Code Playgroud)

这需要在循环中完成,因为每个表中大约有50个表具有不同的值.

感谢您帮助初学者!

Vis*_*hal 5

查看BeautifulSoup 这里是http://www.crummy.com/software/BeautifulSoup/documentation.html文档.

PS:它将更加灵活,包括未来的要求!


Gri*_*ave 5

您正在打印stdout的答案的开头,而不是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))
Run Code Online (Sandbox Code Playgroud)

我建议将该类放入utils.py文件并保存在views.py所在的文件夹中.然后导入它.这将通过仅包含视图来帮助保持您的views.py可管理.