鱼C论坛

 找回密码
 立即注册
查看: 1280|回复: 17

[已解决]新手求助!爬到的文章标题是乱码怎么办?

[复制链接]
发表于 2023-8-18 16:11:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想扒学校网站新闻标题,发现结果是乱码,怎么办?

from bs4 import BeautifulSoup
import requests,chardet

url="  "      
req = requests.get(url).text  
# req.encoding = chardet.detect(req.content)['encoding']    #提取网页编码
soup = BeautifulSoup(req,"html.parser")
newnames = soup.findAll('a')  
newtimes = soup.findAll('span',attrs={"class": "time"})  
a = 1  
for newname in newnames:      
    for newtime in newtimes:     
        if newname.string == None:  
            continue  
        else:
            print(f"学校新闻版块第{a}条标题名称: {newname.string}   发布时间 {newtime.string}")  
            a+=1

打印结果如下:(标题为乱码)
学校新闻版块第1条标题名称: å­¦æ ¡ä¸»ç«™   发布时间 2023-08-17
学校新闻版块第2条标题名称: å­¦æ ¡ä¸»ç«™   发布时间 2023-08-17
学校新闻版块第3条标题名称: å­¦æ ¡ä¸»ç«™   发布时间 2023-08-16
学校新闻版块第4条标题名称: å­¦æ ¡ä¸»ç«™   发布时间 2023-08-15
学校新闻版块第5条标题名称: å­¦æ ¡ä¸»ç«™   发布时间 2023-08-13
学校新闻版块第6条标题名称: å­¦æ ¡ä¸»ç«™   发布时间 2023-08-13
学校新闻版块第7条标题名称: å­¦æ ¡ä¸»ç«™   发布时间 2023-08-12
学校新闻版块第8条标题名称: å­¦æ ¡ä¸»ç«™   发布时间 2023-08-11
学校新闻版块第9条标题名称: å­¦æ ¡ä¸»ç«™   发布时间 2023-08-11
学校新闻版块第10条标题名称: å­¦æ ¡ä¸»ç«™   发布时间 2023-08-10
最佳答案
2023-8-18 18:15:38
还要起名字呐 发表于 2023-8-18 16:45
学校新闻版块第1条标题名称: 学校主站   发布时间 2023-08-17
学校新闻版块第2条标题名称: 学校主站    ...

ok,这次加了循环,可以爬以前所有的新闻了
可以给一个最佳答案吗

  1. from bs4 import BeautifulSoup
  2. import requests,chardet


  3. def get(url):
  4.     req = requests.get(url)
  5.     req.encoding="utf-8"
  6.     req=req.text
  7.     # req.encoding = chardet.detect(req.content)['encoding']    #提取网页编码
  8.     soup = BeautifulSoup(req,"html.parser")
  9.     names = soup.findAll('div',class_="list")
  10.     newnames=[a['title'] if 'title' in a.attrs else '' for a in soup.find_all('a')]
  11.     newnames = [name for name in newnames if name!='']s's's's
  12.     newtimes = soup.findAll('span',attrs={"class": "time"})
  13.     a = 1
  14.     for i in range(len(newnames)):
  15.         if newnames[i] == None:
  16.             continue  
  17.         else:
  18.             try:
  19.                 print("学校新闻版块第",i,"条标题名称:\t",newnames[i],"     发布时间     ",newtimes[i].text)  
  20.                 a+=1
  21.             except:
  22.                 pass

  23. get("https://news.wtu.edu.cn/xxxw.htm")
  24. for j in range(295):
  25.     if 294-j!=0:
  26.         j=294-j
  27.     else:
  28.         break
  29.     get("https://news.wtu.edu.cn/xxxw/"+str(j)+".htm")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-8-18 16:11:55 | 显示全部楼层
你遇到的问题是爬取的文章标题出现乱码。这个问题通常是由于网页编码和解析方式不匹配导致的。解决这个问题的方法有两种:

1. 指定正确的网页编码:你可以使用 chardet 库来检测网页的编码,然后将编码应用到 requests 的  encoding  属性上。你可以取消注释  # req.encoding = chardet.detect(req.content)['encoding']  这一行代码,并将其放在  req = requests.get(url).text  之后。这样做可以尝试使用正确的编码来解析网页内容,从而避免乱码问题。

2. 解析乱码的网页内容:如果指定了正确的编码后仍然无法解决乱码问题,你可以尝试使用  html.parser  解析器之外的其他解析器,例如  lxml  或  html5lib 。你可以修改  BeautifulSoup  的第二个参数为  "lxml"  或  "html5lib" ,并重新运行代码。这些解析器可能能够更好地处理乱码问题。

希望以上解决方法能够帮助你解决乱码问题!如果还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-18 16:12:12 | 显示全部楼层
你遇到的问题可能是由于网页编码不匹配导致的乱码。你可以尝试以下方法解决:

1. 使用chardet库检测网页的编码,并将其设置为正确的编码。你可以取消注释代码中的 req.encoding 这一行,并将其修改为:
  
  1.    req.encoding = chardet.detect(req.content)['encoding']
  2.    
复制代码

2. 如果步骤1不能解决问题,可以尝试使用不同的解析器来解析网页。你当前使用了BeautifulSoup的默认解析器"html.parser",你可以尝试使用其他解析器,如"lxml"或"html5lib"。例如,将下面这行代码:
  
  1.    soup = BeautifulSoup(req, "html.parser")
  2.    
复制代码
   修改为:
  
  1.    soup = BeautifulSoup(req, "lxml")
  2.    
复制代码

这些方法可以帮助你解决文章标题乱码的问题。如果仍然无法解决,请提供更多关于问题的详细信息,以便我能够给出更具体的解决方案。

如果回答对你有帮助,请给我一个最佳答案!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-18 16:12:26 | 显示全部楼层
你遇到的问题是爬取到的文章标题显示为乱码。这个问题通常是由于编码不一致导致的。你可以尝试对爬取到的网页内容进行编码处理,确保使用正确的编码格式进行解码。

在你的代码中,可以使用 chardet 库来检测网页的编码。然后,使用正确的编码格式对网页内容进行解码。下面是修改后的代码:

  1. from bs4 import BeautifulSoup
  2. import requests
  3. import chardet

  4. url = "your_url"
  5. req = requests.get(url).content
  6. encoding = chardet.detect(req)['encoding']
  7. text = req.decode(encoding)
  8. soup = BeautifulSoup(text, "html.parser")
  9. newnames = soup.findAll('a')
  10. newtimes = soup.findAll('span', attrs={"class": "time"})

  11. a = 1
  12. for newname in newnames:
  13.     for newtime in newtimes:
  14.         if newname.string == None:
  15.             continue
  16.         else:
  17.             print(f"学校新闻版块第{a}条标题名称: {newname.string} 发布时间 {newtime.string}")
  18.         a += 1
复制代码


这样修改之后,应该能够正确显示文章标题了。请将 your_url 替换为你要爬取的学校网站新闻页面的链接。

希望这能帮助到你!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-18 16:15:21 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-18 16:21:29 | 显示全部楼层
不行,取消注释,修改soup语句之后,报错:
AttributeError: 'str' object has no attribute 'content'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-18 16:22:53 | 显示全部楼层
还要起名字呐 发表于 2023-8-18 16:21
不行,取消注释,修改soup语句之后,报错:
AttributeError: 'str' object has no attribute 'content'

你牛逼,爬学校网站。。。

我帮你看看代码哈,别急
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-18 16:24:29 | 显示全部楼层
还要起名字呐 发表于 2023-8-18 16:21
不行,取消注释,修改soup语句之后,报错:
AttributeError: 'str' object has no attribute 'content'

你学校网站url不好公布吗

你试一下
response.encoding='utf-8'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-18 16:26:13 | 显示全部楼层
陶远航 发表于 2023-8-18 16:24
你学校网站url不好公布吗

你试一下

fishc不让我上传网站链接。"https:/news.wtu.edu.cn/xxxw.htm"

点评

10#  发表于 2023-8-18 16:36
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-18 16:34:10 | 显示全部楼层
看看这个
  1. from bs4 import BeautifulSoup
  2. import requests,chardet

  3. url="https:/news.wtu.edu.cn/xxxw.htm"      
  4. req = requests.get(url)
  5. req.encoding="utf-8"
  6. req=req.text
  7. # req.encoding = chardet.detect(req.content)['encoding']    #提取网页编码
  8. soup = BeautifulSoup(req,"html.parser")
  9. newnames = soup.findAll('a')  
  10. newtimes = soup.findAll('span',attrs={"class": "time"})  
  11. a = 1  
  12. for newname in newnames:      
  13.     for newtime in newtimes:     
  14.         if newname.string == None:  
  15.             continue  
  16.         else:
  17.             print(f"学校新闻版块第{a}条标题名称: {newname.string}   发布时间 {newtime.string}")  
  18.             a+=1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-18 16:36:28 | 显示全部楼层
isdkz 发表于 2023-8-18 16:11
你遇到的问题是爬取的文章标题出现乱码。这个问题通常是由于网页编码和解析方式不匹配导致的。解决这个问题 ...

尝试过后,报错:AttributeError: 'str' object has no attribute 'content'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-18 16:45:33 | 显示全部楼层

学校新闻版块第1条标题名称: 学校主站   发布时间 2023-08-17
学校新闻版块第2条标题名称: 学校主站   发布时间 2023-08-17
学校新闻版块第3条标题名称: 学校主站   发布时间 2023-08-16
学校新闻版块第4条标题名称: 学校主站   发布时间 2023-08-15
学校新闻版块第28条标题名称: 收藏本站   发布时间 2023-08-16
学校新闻版块第29条标题名称: 收藏本站   发布时间 2023-08-15

倒是不乱码了,但我的标题呢。。
尊敬的VIP高级会员,你再帮我看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-18 16:46:33 | 显示全部楼层
还要起名字呐 发表于 2023-8-18 16:45
学校新闻版块第1条标题名称: 学校主站   发布时间 2023-08-17
学校新闻版块第2条标题名称: 学校主站    ...

好的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-18 18:01:54 | 显示全部楼层
还要起名字呐 发表于 2023-8-18 16:45
学校新闻版块第1条标题名称: 学校主站   发布时间 2023-08-17
学校新闻版块第2条标题名称: 学校主站    ...


久等了,我再来一个循环获取所有标题
  1. from bs4 import BeautifulSoup
  2. import requests,chardet

  3. url="https://news.wtu.edu.cn/xxxw.htm"      
  4. req = requests.get(url)
  5. req.encoding="utf-8"
  6. req=req.text
  7. # req.encoding = chardet.detect(req.content)['encoding']    #提取网页编码
  8. soup = BeautifulSoup(req,"html.parser")
  9. names = soup.findAll('div',class_="list")
  10. newnames=[a['title'] if 'title' in a.attrs else '' for a in soup.find_all('a')]
  11. newnames = [name for name in newnames if name!='']
  12. print(newnames)
  13. newtimes = soup.findAll('span',attrs={"class": "time"})
  14. a = 1
  15. for i in range(len(newnames)):
  16.     if newnames[i] == None:
  17.         continue  
  18.     else:
  19.         print("学校新闻版块第",i,"条标题名称:\t",newnames[i],"     发布时间     ",newtimes[i].text)  
  20.         a+=1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-18 18:15:38 | 显示全部楼层    本楼为最佳答案   
还要起名字呐 发表于 2023-8-18 16:45
学校新闻版块第1条标题名称: 学校主站   发布时间 2023-08-17
学校新闻版块第2条标题名称: 学校主站    ...

ok,这次加了循环,可以爬以前所有的新闻了
可以给一个最佳答案吗

  1. from bs4 import BeautifulSoup
  2. import requests,chardet


  3. def get(url):
  4.     req = requests.get(url)
  5.     req.encoding="utf-8"
  6.     req=req.text
  7.     # req.encoding = chardet.detect(req.content)['encoding']    #提取网页编码
  8.     soup = BeautifulSoup(req,"html.parser")
  9.     names = soup.findAll('div',class_="list")
  10.     newnames=[a['title'] if 'title' in a.attrs else '' for a in soup.find_all('a')]
  11.     newnames = [name for name in newnames if name!='']s's's's
  12.     newtimes = soup.findAll('span',attrs={"class": "time"})
  13.     a = 1
  14.     for i in range(len(newnames)):
  15.         if newnames[i] == None:
  16.             continue  
  17.         else:
  18.             try:
  19.                 print("学校新闻版块第",i,"条标题名称:\t",newnames[i],"     发布时间     ",newtimes[i].text)  
  20.                 a+=1
  21.             except:
  22.                 pass

  23. get("https://news.wtu.edu.cn/xxxw.htm")
  24. for j in range(295):
  25.     if 294-j!=0:
  26.         j=294-j
  27.     else:
  28.         break
  29.     get("https://news.wtu.edu.cn/xxxw/"+str(j)+".htm")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-18 20:01:49 | 显示全部楼层
陶远航 发表于 2023-8-18 18:15
ok,这次加了循环,可以爬以前所有的新闻了
可以给一个最佳答案吗

哇 newnames这么写我得学3天!你真的好厉害 !感谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-18 20:03:30 | 显示全部楼层
还要起名字呐 发表于 2023-8-18 20:01
哇 newnames这么写我得学3天!你真的好厉害 !感谢大佬

哈哈哈,多练你就懂了。
这是装逼的写法,小白还是建议老老实实写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 22:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表