【问题标题】:python - How to parse an HTML tablepython - 如何解析 HTML 表格
【发布时间】:2011-09-11 20:38:57
【问题描述】:

我有一个包含大约 50 个表格的 HTML 页面。每个表的布局相同,但值不同,例如:

<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 个不同值的表。

感谢您帮助初学者!

【问题讨论】:

    标签: python django parsing rest


    【解决方案1】:

    您正在打印 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))
    

    我建议将该类放入 utils.py 文件中,并与您的 views.py 保存在同一文件夹中。然后将其导入。这将有助于通过仅包含视图来使您的 views.py 易于管理。

    【讨论】:

    • 感谢您的回复。看起来这几乎是我正在寻找的解决方案!它可以工作,但打印出如下标签:'\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t', '\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t', '\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t', '1', '10', '32', '35', '39', '45', '33', 。知道如何过滤掉这些吗?
    • 是否可以只检索匹配class=usernumclass=totalnum的数据。
    • 在方法中添加了not data.isspace()。应该过滤掉噪音。正如 eoinzy 提到的,您可以检查 attrs var 进行额外过滤。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-20
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 2017-06-23
      • 2021-04-16
      • 2021-09-08
      • 2014-09-23
      相关资源
      最近更新 更多