0

我想使用 Django 创建一个简单的(一页)Web 应用程序,并查看来自 alexa.com/topsites/global 的前 20 个网站。该页面应呈现一个包含 21 行(1 个标题和 20 个网站)和 3 列(排名、网站和描述)的表格。

我使用 django 的知识有限,如果可能的话,我真的需要一些帮助。

我已经使用模板通过一些引导程序创建了一个表,但我实际上不知道如何解析:排名/网站名称/和描述。

有人可以通过一些有用的网站/代码片段引导我走向正确的方向吗?

我知道我必须使用HTMLParser和实现类似的东西:

from HTMLParser import HTMLParser

# create a subclass and override the handler methods
class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print "Encountered a start tag:", tag
    def handle_endtag(self, tag):
        print "Encountered an end tag :", tag
    def handle_data(self, data):
        print "Encountered some data  :", data

# instantiate the parser and fed it some HTML
parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1></body></html>')

但我不知道如何在我的应用程序中使用它。


所以,我回来更新。我试过这样做(只是为了打印结果,看看我是否得到了我想要的)但我只得到了一些链接。

有什么帮助吗?

import urllib2, HTMLParser

class MyHTMLParser(HTMLParser.HTMLParser):
    def reset(self):
        HTMLParser.HTMLParser.reset(self)
        #count div to get the rank of website
        self.in_count_div = False
        #description div to get description of website
        self.in_description_div = False
        #a tag to get the url
        self.in_link_a = False

        self.count_items = None
        self.a_link_items = None
        self.description_items = None

    def handle_starttag(self, tag, attrs):
        if tag == 'div':
            if('class', 'count') in attrs:
                self.in_count_div = True

        if tag == 'a':
            for name, value in attrs:
                if name == 'href':
                    self.a_link_items = [value,'']
                    self.in_link_a = True
                    break

        if tag == 'div':
            if('class', 'description') in attrs:
                self.in_description_div = True

    #handle data for each section
    def handle_data_count(self, data):
        if self.in_count_div:
            self.count_items[1] += data

    def handle_data_url(self, data):
        if self.in_link_a:
            self.a_link_items[1] += data

    def handle_data_description(self, data):
        if self.in_description_div:
            self.description_items[1] += data

    #endtag
    def handle_endtag(self, tag):
        if tag =='div':
            if self.count_items is not None:
                print self.count_items
            self.count_items = None
            self.in_count_div = False

        if tag =='a':
            if self.a_link_items is not None:
                print self.a_link_items
            self.a_link_items = None
            self.in_link_a = False


if __name__ == '__main__':
    myhtml = MyHTMLParser()
    myhtml.feed(urllib2.urlopen('http://www.alexa.com/topsites/global').read())
4

3 回答 3

2

如果你想要一个 API,这里有一个用于 Alexa 的API

如果你太想刮,我建议BeautifulSoup
(刮板对于这个来说太重了,因为你唯一要做的就是从一个 URL 读取。)

这样做很简单:

  • 制作一个 python 模块,使用 BeautifulSoup 从 Alexa 链接提取数据,在模块中使其每 5 分钟或任何时间跨度运行一次任务,您的应用程序将有效,然后将其保存到您的数据库中。
  • 要显示数据,您将从数据库中检索它,然后将其传递给模板变量中的模板,html 应该看起来像这样(不要使用表格):
<table>
    {% for site in top_20_sites %}
    <tr>
        <td>{{site.rank}}</td>
        <td>{{site.name}}</td>
        <td>{{site.description}}</td>
    <\tr>
    {% endfor %}
</table>

至于如何刮看这个很棒的教程在这里

于 2015-03-28T16:35:00.557 回答
1

如果你做一个快速的谷歌搜索,你会发现一堆关于如何使用 HTMLParser 模块的 SO 问题。在结果的顶部,这两个问题似乎与您尝试做的事情相关(提取特定标签):

但是——正如上面的另一个答案所暗示的——你可以使用像 BeautifulSoup 这样的库来解析和提取标签,从而节省大量工作:

一旦你有了提取的数据——使用你选择的任何方法——Django 演示部分应该很简单。

于 2015-03-28T16:41:09.707 回答
0

你为什么不使用 Scrapy 构建一个爬虫,让它每天运行,将数据保存在你的数据库中,并使用 Django 创建一个显示最新结果的站点。全部在 Python 中。

于 2015-03-28T16:05:54.083 回答