首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django中没有为BeautifulSoup获得任何输出

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

Stack Overflow用户
提问于 2016-09-19 01:19:06
回答 2查看 404关注 0票数 3

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

views.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
{% if list1 %}

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

我做错什么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-19 17:07:07

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

不要使用:

代码语言:javascript
复制
items.title

使用:

代码语言:javascript
复制
items.title.get_text()

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

代码语言:javascript
复制
soup = BeautifulSoup(urlopen(xmllink), 'lxml-xml')
票数 2
EN

Stack Overflow用户

发布于 2016-09-19 04:14:16

来自文档

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

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

来自BeautifulSoup文档

调用标记就像调用find_all()

例如:tagX('a')返回在此tagX中找到的所有<a>标记的列表。

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

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

代码语言:javascript
复制
list1 = [item.title.text for item in soup.find_all('item')]

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

代码语言:javascript
复制
for item in soup.find_all('item'):
    title = item.title
    title.do_not_call_in_templates = True
    list1.append(title)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39564141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档