【问题标题】:Parsing different unicode files using BeautifulSoup使用 BeautifulSoup 解析不同的 unicode 文件
【发布时间】:2013-10-05 23:11:01
【问题描述】:

我有这个具有编解码器的特定 HTML 页面

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">

现在,当我尝试使用 BeautifulSoup 解析这个特定文件时,它总是返回 NULL 对象。 我可以使用它来转换它:

page = codecs.open('file_name', 'r', 'cp1251')
soup = BeautifulSoup(page.read())

现在它工作正常。但在我的收藏中,我的页面包含 UTF-8windows-1251 字符集类型。所以,我想知道确定特定 HTML 页面的字符集的过程是什么,如果它是 windows-1251 格式,则进行相应的转换?

我发现了这个:

soup.originalEncoding

但为此我需要将其加载到“汤”中。但只有它返回“无类型对象”。任何帮助将不胜感激。

我正在使用 Python 2.7

编辑:

这是我真正想说的一个例子:

这是我的代码:

from bs4 import BeautifulSoup
import urllib2

page=urllib2.urlopen(Page_link)
soup = BeautifulSoup(page.read())

print soup.html.head.title

页面有

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

正确显示页面标题。

现在如果页面有

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">

那么输出是

AttributeError: 'NoneType' 对象没有属性 'head'

现在我可以使用上面提到的编解码器库来解决这个问题。我想知道的是如何确定编码以便能够应用它。

这是两个试图抓取和收集某些信息的网站:

http://www.orderapx.com/http://www.prpoakland.com/

【问题讨论】:

  • 您将页面解码为 Unicode,而不是 UTF8。 UTF8 是另一种编码,就像 Windows-1251 一样。你能给我们展示示例源代码吗?源码中真的是"charset=charset=..."吗?
  • 对不起,我的错。我复制错了。我编辑了这一行。感谢您指出。
  • 另外,这是 BeautifulSoup 3 还是 4? 通常,我希望 BeautifulSoup 找到 &lt;meta /&gt; 标签并为您检测编码。
  • 美汤 4.3.1 !
  • 我会寻找 Content-Type 标头,如果存在并包含 charset=.. 参数,请使用该参数告诉 BeautifulSoup 使用什么编解码器。见crummy.com/software/BeautifulSoup/bs4/doc/#encodings

标签: python python-2.7 html-parsing beautifulsoup cp1251


【解决方案1】:

您正在从网络加载您的网页;查找带有charset 参数的内容类型标头,以查看网络服务器是否已经告诉您有关编码的信息:

charset = page.headers.getparam('charset')
soup = BeautifulSoup(page.read(), from_encoding=charset)

如果不存在这样的参数,charset 将设置为 None,BeautifulSoup 将回退到猜测。

你也可以试试different parsers;如果 HTML 格式错误,不同的解析器会以不同的方式修复 HTML,也许让 BeautifulSoup 更好地检测编码。

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2016-10-02
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多