在Django中没有为BeautifulSoup获取任何输出

时间:2016-09-19 01:19:07

标签: python django beautifulsoup render

我在Django中尝试BeautifulSoup4,并用它解析了一个XML页面。当我尝试以不同的方式在python解释器中解析相同的XML页面时,它工作正常。但是在Django中,我得到了一个如下所示的页面。

enter image description here

views.py:

def rssfeed(request):
    list1=[]
    xmllink="https://rss.sciencedaily.com/computers_math/computer_programming.xml"
    soup=BeautifulSoup(urlopen(xmllink),'xml')
    for items in soup.find_all('item'):
        list1.append(items.title)
    context={
        "list1":list1
    }
    return render(request,'poll/rssfeed.html',context)

rssfeed.html:

{% if list1 %}

<ul>
    {% for item in list1 %}
        <li>{{ item }}</li>
    {% endfor %}
</ul>
{% endif %}

我做错了什么?

2 个答案:

答案 0 :(得分:2)

要从XML获取文本,您需要调用get_text()函数。

不要使用:

items.title

使用:

items.title.get_text()

此外,建议使用 lxml 进行解析。安装lxml python并使用:

soup = BeautifulSoup(urlopen(xmllink), 'lxml-xml')

答案 1 :(得分:0)

来自documentation

  

如果变量的任何部分是可调用的,模板系统将尝试调用它。

  

有时您可能会出于其他原因关闭此功能,并告诉模板系统无论如何都要保留未调用的变量。为此,请在callable上设置do_not_call_in_templates属性,其值为True。

来自BeautifulSoup documentation

  

调用标记就像调用find_all()

一样

EG。 tagX('a')会返回此<a>中找到的所有tagX代码的列表。

模板中的item引用bs4.element.Tag的实例,该实例可以调用。因此Django使用零参数调用item变量,这意味着它将返回item内所有元素的列表,因为它只包含文本,所以没有。因此空白列表。

因此要么在将上下文传递给模板之前解析上下文

list1 = [item.title.text for item in soup.find_all('item')]

或者,如果您出于某种原因想要传递实例,可以将do_not_call_in_templates属性设置为

for item in soup.find_all('item'):
    title = item.title
    title.do_not_call_in_templates = True
    list1.append(title)