【问题标题】:Unable to extract data from BeautifulSoup object after utf-8 conversion due to 'str' typecasting由于“str”类型转换,在 utf-8 转换后无法从 BeautifulSoup 对象中提取数据
【发布时间】:2016-07-14 16:34:11
【问题描述】:

我正在尝试使用 Python 构建自己的网络爬虫。其中一个步骤涉及解析 HTML 页面,为此我使用 BeautifulSoup,这是大多数教程中推荐的解析器。这是我应该提取页面并打印它的代码:

import urllib
from bs4 import BeautifulSoup

urlToRead = "http://www.randomjoke.com/topic/haha.php"
handle = urllib.urlopen(urlToRead)
htmlGunk =  handle.read()
soup = BeautifulSoup(htmlGunk, "html.parser")
soup = soup.prettify()
print (soup)

但是,当我执行soup.prettify() 然后打印它时,似乎出现了错误。错误是:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa9' in 位置 16052:序数不在范围内(128)

为了解决这个问题,我进一步搜索并遇到了this SO 的答案,它解决了这个问题。我基本上必须将编码设置为'utf=8',我这样做了。所以这里是修改后的代码(仅最后 2 行):

soup = soup.prettify().encode('utf-8')
print (soup)

这很好用。当我尝试使用教程here 中提到的soup.get_text() 方法时,就会出现问题。每当我执行soup.get_text() 时,都会出现错误:

AttributeError: 'str' 对象没有属性 'get_text'

我认为这是意料之中的,因为我将汤编码为“utf-8”,并将其更改为str。我尝试在utf-8 转换之前和之后打印type(soup),正如预期的那样,在转换之前它是bs4.BeautifulSoup 类的对象,之后是str

我该如何解决这个问题?我很确定我做错了什么,并且有解决这个问题的正确方法。不幸的是,我对 Python 不太熟悉,所以请多多包涵

【问题讨论】:

  • 如果您唯一的问题是无法正常工作print,您可以在打印行上执行encode
  • 所以基本上是print(soup.get_text().encode('utf-8'))?
  • 是的,为什么不呢?您无需替换您的 soup 对象即可打印它。
  • 只打印它或使用其他变量来保存它而不是汤
  • 是的,那是因为 soup.prettify() 返回 unicode 并且您丢失了原来的 bs4.BeautifulSoup 对象。此错误已在您的代码中。

标签: python encoding utf-8 beautifulsoup


【解决方案1】:

您不应该丢弃您原来的soup 对象。需要打印时可以调用soup.prettify().encode('utf-8')(或保存到不同的变量中)。

【讨论】:

    【解决方案2】:
    import urllib
    from bs4 import BeautifulSoup
    
    urlToRead = "http://www.randomjoke.com/topic/haha.php"
    handle = urllib.urlopen(urlToRead)
    htmlGunk =  handle.read()
    soup = BeautifulSoup(htmlGunk, "html.parser")
    html_code = soup.prettify().encode('utf-8')
    text = soup.get_text().encode('utf-8')
    
    print html_code
    print "#################"
    print text
    
    
    
    # a = soup.find()
    # l = []
    # for i in a.next_elements:
    #     l.append(i)
    

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多