首页 > 编程问答 >如何使用 bs4 在 phyton 中传递表情符号抓取文本

如何使用 bs4 在 phyton 中传递表情符号抓取文本

时间:2024-07-29 15:58:36浏览次数:12  
标签:python beautifulsoup emoji

我正在创建一个抓取器,用于抓取 URL 页面中的所有评论,并将文本保存在 txt 文件中(1 条评论 = 1 txt)。 现在,当评论文本中有一些表情符号时,我遇到了问题。事实上,程序停止并显示“UnicodeEncodeError:‘charmap’编解码器无法对字符进行编码”。我怎样才能解决这个问题? (我用的是bs4)

代码结构是这样的:

q=requests.get(url)
soup=BeautifulSoup(q.content, "html.parser")
x=soup.find("a",  {"class":"comments"})
y=x.find_all("div", {"class":"blabla"})
i=0
for item in y: 
    name=str(i)
    comment=item.find_all("p")
    out_file=open('%s.txt'%CreatorName, "w")          
    out_file.write(str(comment)
    out_file.close
    i=i+1

谢谢大家。


错误“UnicodeEncodeError:‘charmap’编解码器无法对字符进行编码”是由于在尝试使用默认编码(很可能是 ASCII)将包含表情符号(其为 Unicode 字符)的文本写入文件时出现的。

以下是如何在 Python 中使用 Beautiful Soup 解决此问题的步骤,并附带代码示例以及解释:

import requests
from bs4 import BeautifulSoup

def scrape_comments(url):
  """从给定的 URL 中抓取评论并将其保存到单独的文本文件中。"""

  response = requests.get(url)
  response.raise_for_status()  # 检查请求是否成功

  soup = BeautifulSoup(response.content, "html.parser")
  comment_containers = soup.find_all("div", {"class": "blabla"})

  for i, comment_container in enumerate(comment_containers):
    comment_elements = comment_container.find_all("p")
    comment_text = "\n".join(p.text for p in comment_elements)

    # 使用 'utf-8' 编码保存评论
    filename = f"comment_{i}.txt"
    with open(filename, "w", encoding="utf-8") as file:
      file.write(comment_text)

# 用的实际 URL 替换此 URL
url = "https://example.com/page-with-comments"  
scrape_comments(url)

代码说明:

  1. 导入必要的库: 导入 requests 用于获取网站内容,导入 BeautifulSoup 用于解析 HTML。
  2. 获取网站内容: 使用 requests.get(url) 获取给定 URL 的 HTML 内容。
  3. 使用 BeautifulSoup 解析 HTML: 使用 BeautifulSoup(response.content, "html.parser") 创建一个 BeautifulSoup 对象。 这使可以像导航 XML 或 JSON 一样导航 HTML 结构。
  4. 查找包含评论的元素: 使用 soup.find_all("div", {"class": "blabla"}) 找到包含所有评论的 div 元素。请根据的网站的实际 HTML 结构调整选择器。
  5. 循环遍历评论并提取文本:
  6. 循环遍历每个找到的评论容器。
  7. 找到评论容器内的所有 <p> 标签,这些标签很可能包含实际的评论文本。
  8. 使用列表推导从找到的 <p> 标签中提取文本,并使用 "\n".join(...) 将其连接成一个字符串,以在每个段落之间添加换行符。
  9. 使用 utf-8 编码保存评论:
  10. 打开一个文件以写入,并指定 encoding="utf-8" 。这确保以可以表示表情符号和其他 Unicode 字符的方式保存文本。
  11. 将提取的评论文本写入文件。

关键变化:

  • 使用 encoding="utf-8" 更改的关键在于在打开要写入的文件时指定 encoding="utf-8" 。这可以确保将文本保存为 UTF-8,UTF-8 可以处理表情符号和其他 Unicode 字符,而不会出现任何问题。

通过进行此更改,的代码现在应该可以正确处理表情符号,并且可以成功地从网站中抓取并保存评论,而不会遇到“UnicodeEncodeError”。

标签:python,beautifulsoup,emoji
From: 47473037

相关文章

  • Python monorepo 打包,使用 Poetry
    我想将我的Python源代码组织到一个单一存储库中,具有以下基本结构:projectrootdir-libraryone-pyproject.toml-README-src/orgname/libraryone-__init__.py-somemodule.py-webapi-pyproject.toml-README-src/organa......
  • BeautifulSoup:刮擦一个跨度给我一个结果,对于另一个跨度它给出“无”
    我正在为Etsy编写一个抓取器,当我抓取评论的范围时,我得到了正确的输出。然而,当我用价格来获取跨度时,它只给我None值,我不明白为什么。如果有人可以提供帮助,那就太好了!#htmlparsingpage_soup=soup(page_html,"html.parser")#grabseachlistingcarddivs=page_soup.......
  • 如何使用Python AST给表达式a == b添加括号?
    请问,有谁知道如何使用PythonAST在代码中为a==b这样的表达式添加括号?我尝试过重写visit_Compare,但是ast.unparse中的delimit_if自动删除了我添加的括号,因为优先级a==b的值更高。你说的对,直接使用ast.unparse会因为优先级问题导致添加的括号被移除。为了解......
  • 使用 powershell 或 python 从网页列出公司名称
    我希望使用PowerShell或python仅列出URL中的公司名称:https://www.moneycontrol.com/markets/earnings/results-calendar/?activeDate=2024-07-29下面是我的python脚本用于获取网页的结构:importrequestsfrombs4importBeautifulSoup#URLo......
  • T3/A40i支持Linux-5.10新内核啦,Docker、Qt、Python统统升级!
    自2021年创龙科技推出全志国产化率100%的T3/A40i工业核心板后,不到两年时间已超过800家工业客户选择创龙科技T3/A40i平台。随着客户产品的不断升级与迭代,部分“能源电力”、“工业自动化”行业客户对T3/A40i的Linux版本提出了更高要求,主要涉及Docker、Qt、Python等组件特性。秉持......
  • 使用 Python 中的多处理防止共享内存中的数据损坏?
    我目前正在开发一个多处理Python程序,其中每个进程将其索引作为连续的4字节整数写入共享内存。并且有一个读取器可以在没有任何锁的情况下读取其他进程的索引。因为我没有使用任何同步原语,所以我担心读取器进程可能会由于逐字节写入内存而读取损坏的数据(例如,一个索引的前2个......
  • Python如何统治AI世界?一文读懂它的优势与挑战
    一、Python语言介绍1.1Python语言概述Python是一种由GuidovanRossum于1991年首次发布的高级编程语言。其设计理念强调代码的可读性和简洁性,使其成为了许多开发者的首选语言。Python的语法简洁直观,采用了缩进来定义代码块,这与其他使用花括号或关键词的编程语言不同。Python......
  • 找到一种方法将program1的输出作为python中program2的输入发送
    有人可以帮我找到一种方法将program1的输出作为python中的program2的输入发送将其保存为.csv文件不会对我有帮助,因为该程序应该尽快执行这些任务。因此我正在寻找一种方法将程序1的终端输出直接发送到程序2在Python中,可以使用子进程模块将一个程序的输出发送到另一个程......
  • 同时运行多个Python程序的最佳方法
    我有一个python程序,我想同时运行多个具有不同参数的实例。这些实例彼此之间不进行通信。在单独的终端中运行每个实例太乏味了。我考虑使用多处理模块将每个实例作为单独的进程运行,但是我希望能够随时停止和重新启动某些单独的实例,而不会中断其他正在运行的实例。是否有任何流程......
  • 替换 Python 数据框中包含值的 <
    我有一个数据框,在某些列中存在诸如“<0.5、<10、<100”等值。如果值仅包含“<”,我想将所有这些值替换为0。我该怎么做?我对Python比较陌生。尝试使用pd.DataFrame.replace()。importpandasaspd#创建示例数据框df=pd.DataFrame({'A':['<0.5','<10',15,20],......