Python - Как разобрать таблицу HTML - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть 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 Iя вызываю мою 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 голосов
/ 12 сентября 2011

Вы печатаете начало ответа на стандартный вывод, а не на 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 управляемыми, только содержащие представления.

5 голосов
/ 12 сентября 2011

Проверьте BeautifulSoup вот документация http://www.crummy.com/software/BeautifulSoup/documentation.html.

PS: Это будет намного более гибко, включая будущие требования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...