【问题标题】:unexpected result while parsing html with bs4使用 bs4 解析 html 时出现意外结果
【发布时间】:2020-10-20 08:32:54
【问题描述】:

我在 Python 3.8.2 中尝试此代码:

from bs4 import BeautifulSoup
import urllib.request

html = urllib.request.urlopen(
    'https://vietnamnet.vn/').read()

soup = BeautifulSoup(html, "html.parser").encode("utf-8")

print(soup.title)

但我收到了:

而不是预期:<title>Báo VietNamNet - Tin tức online, tin nhanh Việt Nam và thế giới</title>

我做错了什么,我该如何解决?

我必须使用 .encode("utf-8") 因为 html 字符串 包含 unicode 字符。对有影响吗?

谢谢!

【问题讨论】:

  • title是一个函数,所以你必须调用函数:print(soup.title()),否则你会得到函数对象本身。

标签: python python-3.x beautifulsoup web-crawler python-unicode


【解决方案1】:

当您在解析器上运行.encode() 时,您正在为soup 分配一个字节字符串。解析器完全丢失,.encode() 返回一个字节字符串。

bs4 应该为你处理字符集。

soup = BeautifulSoup(html, "html.parser")
print(soup.title)

输出:

>>> from bs4 import BeautifulSoup
>>> import urllib.request
>>> html = urllib.request.urlopen(
...     'https://vietnamnet.vn/').read()

>>> soup = BeautifulSoup(html, "html.parser")
>>> print(soup.title)
<title>Báo VietNamNet - Tin tức online, tin nhanh Việt Nam và thế giới</title>
>>> 

【讨论】:

  • 你能试试我的代码吗?因为如果我不通过 .encode(),python 会引发此错误:“UnicodeEncodeError: 'charmap' codec can't encode character '\u1ee9' in position 29: character maps to
  • 是的,代码对我来说效果很好,你使用的是什么版本的 Python?我将使用我的输入/输出来编辑我的答案。
  • 我不知道出了什么问题?我使用的是 Windows 10,python 3.8.2
【解决方案2】:
from bs4 import BeautifulSoup
import urllib.request

html = urllib.request.urlopen(
    'https://vietnamnet.vn/').read().decode("utf-8")

soup = BeautifulSoup(html, "html.parser")

title = soup.title
print(title)
print(title.string)

阅读时必须解码。

【讨论】:

  • 我试过这个但收到这个错误:“UnicodeEncodeError: 'charmap' codec can't encode character '\u1ee9' in position 29: character maps to
  • 这对我有用(也在 3.8.2 上试过)。您是否正在尝试将数据写入文件?看看这里stackoverflow.com/questions/27092833/…
【解决方案3】:

阅读您的网址后,您应该使用如下适当的编码格式对其进行解码。

from urllib import request
from bs4 import BeautifulSoup
import urllib.request

html = urllib.request.urlopen(
    'https://vietnamnet.vn/').read().decode('utf8')

soup = BeautifulSoup(html, "html.parser")
title = soup.find('title')

print("title is :", title)

【讨论】:

  • 我在尝试您的代码时遇到了这个错误:“UnicodeEncodeError: 'charmap' codec can't encode character '\u1ee9' in position 29: character maps to
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2013-11-07
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
相关资源
最近更新 更多