BeautifulSoup 在 Django 中没有得到任何输出

Posted

技术标签:

【中文标题】BeautifulSoup 在 Django 中没有得到任何输出【英文标题】:Not getting any output in Django for BeautifulSoup 【发布时间】:2017-01-26 14:38:47 【问题描述】:

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

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 %

我做错了什么?

【问题讨论】:

我会在那里放一些打印语句或import pdb; pdb.set_trace() 行,以弹出交互式解释器,看看发生了什么。另外,我认为% if list1 % 是不必要的,因为如果列表为空,for 循环将不会创建任何模板代码。 谢谢。我刚开始学习时不知道。但是参考第二点,我想我可能会在后面写一个 else 语句并打印一些东西。 那么当您在list1.append(items.title) 之前添加print(items.title) 或在return 语句之前添加print(list1) 时,您会在终端窗口中看到什么?运行您的代码,我得到了一个包含在&lt;title&gt; 标签中的标题列表,我认为这是您所期望的。但是,对您而言,每个 item 似乎都是一个空列表[],这很奇怪...我刚刚注意到您在问题中也提到了它在Python 解释器中对您有用,即我在哪里测试过。 另外,您可以尝试从 Django 项目中删除任何已编译的 .pyc 文件,看看您是否只是看到旧代码的影响。 print(list1) 打印终端中的所有标题。但是 item 仍然返回一个空列表 【参考方案1】:

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

不要使用:

items.title

用途:

items.title.get_text()

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

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

【讨论】:

谢谢伙计!干杯【参考方案2】:

来自documentation

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

有时您可能出于其他原因想要关闭此功能,并告诉模板系统无论如何都不要调用变量。为此,请在可调用对象上设置一个 do_not_call_in_templates 属性,其值为 True。

来自BeautifulSoup documentation

调用标签就像调用 find_all()

例如。 tagX('a') 返回在此 tagX 中找到的所有 &lt;a&gt; 标记的列表。

模板中的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)

【讨论】:

对不起,我的错。但即使在更改之后,我在编辑后得到一个只有项目符号的页面,如上面的问题所示。 已相应更新,但会尝试找到更好的解决方案。来自 Django 文档的解决方案无法正常工作(或者我的解释有误)。

以上是关于BeautifulSoup 在 Django 中没有得到任何输出的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Beautiful Soup 网站抓取的结果中将 Django 模型添加到数据库中?

Django进阶之CSRF

Django中的csrf基础了解

Django堆栈开发过程中保存的数据在哪里

BeautifulSoup4中文文档

django相关网站