使用list.append()时出错,打印正常

0 投票
3 回答
529 浏览
提问于 2025-04-18 10:49

我正在尝试制作一个简单的网页抓取工具,它可以给我发送电子邮件,告诉我某个网站上发布的优惠信息。我使用了beautifulsoup这个库来把信息抓取到一个叫“list”的列表里。我可以通过打印命令让输出看起来像我想要的样子,但当我尝试用相同的循环把字符串添加到列表里时,就出现了以下错误。

> ----- Post with most thanks ------ Traceback (most recent call last):
> ----- Trending Hot Deals ------   File "C:/Users/Geoff/PycharmProjects/web_scraping/Historian_file.py", line
> 45, in <module>
> ----- Popular Threads ------
>     print "\n".join(msg)
> ----- New Posts ------ TypeError: sequence item 0: expected string, NoneType found
> 
> Process finished with exit code 1

这是我的代码,注释掉的部分不工作,而打印命令是可以的。

def title(number):
    if number == 1:
        print "----- Post with most thanks ------"
    elif number == 2:
        print "----- Trending Hot Deals ------"
    elif number == 3:
        print "----- Popular Threads ------"
    else:
        print "----- New Posts ------"
msg = []
x = 1
for i in list:
    print title(x)
    #msg.append(title(x))
    x = x+1
    for j in i:
        l = j.encode_contents()
        print l
        #msg.append(l)

#print "\n".join(msg)

我很感谢任何帮助。

谢谢

3 个回答

0

我把这个内容移到答案部分,因为大家给的信息不够全面。

  1. 是的,你需要从函数中返回数据,而不是打印它。所以print改成return,这样就可以了(只要你返回的是字符串,或者对数据进行处理)

  2. 这是一个很好的调试代码的教训。你的错误信息已经说明了问题,但你的标题和其他一些人都忽略了这一点。.join()期望的是字符串类型,所以这就是你遇到问题的地方。

要调试奇怪的问题,你需要更加关注错误信息,虽然这些信息可能被print的输出弄得有点乱(别担心,我们大家之前都忽略过这些数据)。

None是一个有效的类型,可以出现在列表中。因此,当你调用mylist.append(Foo())时,如果Foo什么都不返回,就会把None添加到你的列表中。这是完全有效的。

不过,你真正的问题在于你尝试调用.join(ListWithNotStringsInIt)。可以理解为:我给.join()一个包含项目的列表,其中至少有一个不是字符串,也不能隐式转换为字符串(str())。

为了避免将来出现问题,你应该处理好你的数据

列表推导式是一个很好的方法来做到这一点,不过如果你负责任地处理数据,这其实是完全不必要的:

'\n'.join([str(x) for x in my_list])

Python希望你作为程序员能够明智地使用它。因此,你会有很多自由度(比如看到这样的错误信息)。

在这里不应该需要使用列表推导式,如果你正确使用列表,这其实是完全不必要的。但这是一种检查你得到的内容的方法,特别是在抛出异常和调试问题时。

0

你的 title 函数没有返回任何东西,所以当你试图把调用这个函数的结果加到其他内容上时,其实你并没有加上 title 的结果。相反,你加上的是 None。要解决这个问题,你需要让函数返回结果,而不是仅仅打印出来。

0

这个函数里,把<code>print</code>语句改成<code>return</code>。</p> <pre><code>def title(number): if number == 1: return "----- Post with most thanks ------" elif number == 2: return "----- Trending Hot Deals ------" elif number == 3: return "----- Popular Threads ------" else: return "----- New Posts ------" </code></pre> <p>记住,任何没有<code>return</code>语句的函数,最后都会返回<code>None</code>。</p> </div> </div> <div class="answer-footer"> <div class="answer-author"> 回答于 2025-04-18 由 <a href="#" class="author-name">Python大师</a> </div> <div class="answer-actions"> <a href="#" class="answer-action">分享</a> <a href="#" class="answer-action">举报</a> </div> </div> </div> <div class="answer-form"> <h3 class="form-title">撰写回答</h3> <form> <div class="form-control"> <label for="answer" class="form-label">您的回答</label> <textarea id="answer" class="form-input" placeholder="编写您的回答..."></textarea> </div> <button type="submit" class="btn btn-primary">提交回答</button> </form> </div> </div> </main> <aside class="sidebar"> <!-- 侧边栏顶部广告位 --> <div class="card sidebar-box ad-container"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9314860051288758" crossorigin="anonymous"></script> <!-- qa_detail_sidebar_top --> <ins class="adsbygoogle" style="display:inline-block;width:320px;height:600px" data-ad-client="ca-pub-9314860051288758" data-ad-slot="5193841686"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="card sidebar-box"> <div class="card-header"> <h3 class="card-title">推荐教程</h3> </div> <ul class="related-questions"> <li class="related-question"> <a target="_blank" href="/python/dict.html" class="related-link">Python 字典 Dcit</a> </li> <li class="related-question"> <a target="_blank" href="/python/list-remove.html" class="related-link">Python 列表删除元素</a> </li> <li class="related-question"> <a target="_blank" href="/python/file-handling.html" class="related-link">Python文件操作</a> </li> <li class="related-question"> <a target="_blank" href="/python/scope.html" class="related-link">Python变量作用域</a> </li> <li class="related-question"> <a target="_blank" href="/python/mongodb-find.html" class="related-link">MongoDB:查询文档并筛选字段</a> </li> <li class="related-question"> <a target="_blank" href="/python/mongodb-create-collection.html" class="related-link">MongoDB:创建集合的基础教程</a> </li> <li class="related-question"> <a target="_blank" href="/python/list-methods.html" class="related-link">Python 列表内置方法</a> </li> <li class="related-question"> <a target="_blank" href="/python/for-loop.html" class="related-link">Python for循环</a> </li> <li class="related-question"> <a target="_blank" href="/python/datetime.html" class="related-link">Python 日期和时间操作</a> </li> <li class="related-question"> <a target="_blank" href="/python/mysql-create-table.html" class="related-link">创建 MySQL 表</a> </li> <li class="related-question"> <a target="_blank" href="/python/tuple-unpack.html" class="related-link">Python 元组解包</a> </li> <li class="related-question"> <a target="_blank" href="/python/string-formatting.html" class="related-link">Python 字符串格式化</a> </li> </ul> </div> <div class="card sidebar-box"> <div class="card-header"> <h3 class="card-title">热门标签</h3> </div> <div style="padding: 1.25rem;"> <a href="#" class="tag">python</a> <a href="#" class="tag">json</a> <a href="#" class="tag">大数据</a> <a href="#" class="tag">内存优化</a> <a href="#" class="tag">pandas</a> <a href="#" class="tag">性能优化</a> <a href="#" class="tag">数据处理</a> <a href="#" class="tag">文件处理</a> </div> </div> <div class="card sidebar-box"> <div class="card-header"> <h3 class="card-title">最新问题</h3> </div> <ul class="related-questions"> <li class="related-question"> <a href="/q/123097" class="related-link">Tk' 未定义</a> <div class="related-stats">1 回答 · 1930 浏览</div> </li> <li class="related-question"> <a href="/q/123096" class="related-link">在Python中写入奇数到列表</a> <div class="related-stats">2 回答 · 583 浏览</div> </li> <li class="related-question"> <a href="/q/123095" class="related-link">Python获取上传/下载速度</a> <div class="related-stats">4 回答 · 8610 浏览</div> </li> <li class="related-question"> <a href="/q/123094" class="related-link">使用PyAudio录制扬声器输出</a> <div class="related-stats">5 回答 · 63780 浏览</div> </li> <li class="related-question"> <a href="/q/123093" class="related-link">读取后从文本文件中删除行</a> <div class="related-stats">2 回答 · 8200 浏览</div> </li> </ul> </div> </aside> </div> <!-- 页脚 --> <footer class="footer"> <div class="footer-container"> <div class="footer-section"> <h3>关于我们</h3> <ul class="footer-links"> <li><a href="#" class="footer-link">关于Python问答</a></li> <li><a href="#" class="footer-link">团队介绍</a></li> <li><a href="#" class="footer-link">加入我们</a></li> </ul> </div> <div class="footer-section"> <h3>帮助中心</h3> <ul class="footer-links"> <li><a href="#" class="footer-link">常见问题</a></li> <li><a href="#" class="footer-link">使用指南</a></li> <li><a href="#" class="footer-link">反馈建议</a></li> </ul> </div> <div class="footer-section"> <h3>社区</h3> <ul class="footer-links"> <li><a href="#" class="footer-link">技术博客</a></li> <li><a href="#" class="footer-link">活动中心</a></li> <li><a href="#" class="footer-link">用户故事</a></li> </ul> </div> <div class="footer-section"> <h3>联系方式</h3> <ul class="footer-links"> <li><a href="#" class="footer-link">联系我们</a></li> <li><a href="#" class="footer-link">商务合作</a></li> <li><a href="#" class="footer-link">微信公众号</a></li> </ul> </div> </div> <div class="footer-bottom"> <p>© 2013~2025 Python问答社区 | 京ICP备07000037号</p> </div> </footer> <script> // 移动端导航菜单切换 const navToggle = document.getElementById('navToggle'); const navMenu = document.getElementById('navMenu'); navToggle.addEventListener('click', () => { navMenu.classList.toggle('active'); }); // 主题切换功能 const themeToggle = document.getElementById('themeToggle'); const body = document.body; // 检查本地存储中的主题设置 const currentTheme = localStorage.getItem('theme') || 'green'; if (currentTheme === 'blue') { body.setAttribute('data-theme', 'blue'); } themeToggle.addEventListener('click', () => { const currentTheme = body.getAttribute('data-theme'); if (currentTheme === 'blue') { body.removeAttribute('data-theme'); localStorage.setItem('theme', 'green'); } else { body.setAttribute('data-theme', 'blue'); localStorage.setItem('theme', 'blue'); } themeToggle.classList.add('active'); setTimeout(() => { themeToggle.classList.remove('active'); }, 300); }); </script> <!-- prism.js 主库 --> <script src="https://unpkg.com/prismjs@1.29.0/prism.js"></script> <!-- prism.js python 语法支持 --> <script src="https://unpkg.com/prismjs@1.29.0/components/prism-python.min.js"></script> <script> // 页面加载完成后执行 document.addEventListener('DOMContentLoaded', function () { // 查找所有没有指定语言的代码块 const unlabeledCodeBlocks = document.querySelectorAll('pre > code:not([class*="language-"])'); unlabeledCodeBlocks.forEach(block => { block.classList.add('language-python'); }); const plaintextBlocks = document.querySelectorAll('pre > code.language-plaintext'); plaintextBlocks.forEach(block => { block.classList.remove('language-plaintext'); block.classList.add('language-python'); }); // 重新高亮所有代码块 Prism.highlightAll(); }); </script> </body> </html>