0

我的views.py中有这段代码:

from django.http import HttpResponse, Http404
from django.shortcuts import render_to_response

from bs4 import BeautifulSoup
import urllib

def extract_links(request):
    starting_link = urllib.urlopen("http://www.finalyearondesk.com")
    soup = BeautifulSoup(starting_link)
    all_links = soup.findAll('a', href = True)          
    return render_to_response('extracted_links.html',{'all_links': all_links })

在这我使用BeautifulSoup。我正在模板文件中编写此代码:extracted_links.html:

{% for final_links in all_links %}
    {{ final_links['href'] }}    # {{ final_links.href }} did not print anything
{% endfor %}

但问题是它显示错误:

Could not parse the remainder: '['href']' from 'final_links['href']'

任何建议如何解决这个问题?如果我在一个简单的 python 文件上使用这个函数,它就可以正常工作,但不能在 django 模板上

4

2 回答 2

1

如果all_links是一个dicts 的列表,每个都有键,href那么执行以下操作来访问hrefDjango 模板中的值:

{% for final_links in all_links %}
    {{ final_links.href }}
{% endfor %}
于 2012-04-12T15:51:32.597 回答
1

尝试:

{% for final_links in all_links %}
   {{ final_links.attrMap.href }}
{% endfor %}

我是从以下会议中得出的:

>>> import urllib
>>> from BeautifulSoup import BeautifulSoup as BS
>>> start = urllib.urlopen('http://blog.tkbe.org')
>>> soup = BS(start)
>>> all_links = soup.findAll('a', href=True)
>>> first = all_links[0]
>>> first
<a href="http://blog.tkbe.org/" title="TKBE" rel="home">TKBE</a>
>>> dir(first)
[..., 'attrMap', 'attrs', ...]
>>> first.attrs
[(u'href', u'http://blog.tkbe.org/'), (u'title', u'TKBE'), (u'rel', u'home')]
>>> first.attrMap
{u'href': u'http://blog.tkbe.org/', u'rel': u'home', u'title': u'TKBE'}

如果您的 BeautifulSoup 版本有其他属性,您可以类似地找到它们。

您可能必须在视图中提取它们,而不是在模板中,例如:

all_links = [link.attrMap['href'] for link in all_links]

在您的退货声明之前(或您需要在您的 BeautifulSoup 版本中访问的任何属性)。

于 2012-04-12T16:05:51.130 回答