【问题标题】:Can't Figure Out Encoding for Beautiful Soup Object无法弄清楚美丽汤对象的编码
【发布时间】:2016-11-20 18:01:18
【问题描述】:

我一直在尝试用 Beautiful Soup 打印出这个网站的文字: http://www3.forbes.com/entrepreneurs/25-most-expensive-schools-worth-every-penny/26/

使用lxml 解析站点会返回乱码和奇怪的字符,而其他解析器根本不会返回任何内容。我尝试将编码指定为 UTF-8 以匹配 site<meta charset="UTF-8"> ,但没有运气。什么是正确的解析器,我将如何实现它?我是 Beautiful Soup 的初学者,非常感谢一个简单、清晰的解释。谢谢!

    from bs4 import BeautifulSoup
import urllib.request

URL = urllib.request.urlopen("http://www3.forbes.com/entrepreneurs/25-most-expensive-schools-worth-every-penny").read()
soup = BeautifulSoup(URL,'xml')

print(soup.text)

【问题讨论】:

    标签: python encoding


    【解决方案1】:

    您看到乱码不是因为 BeautifulSoup 或字符串编码,而是因为 urllib 和服务器的 content-编码。来自服务器的响应头包括:

    内容编码:gzip

    通常默认情况下,如果在检索 url 时发送给服务器的 Accept-encoding 标头为空,则服务器应该压缩内容。但是,由于某种原因,您正在访问的服务器并不关心这一点,而是将其以 gzip 格式发送。即使标头明确设置为'Accept-encoding': 'identity',如下所示:

    URL = urllib.request.Request("http://www3.forbes.com/entrepreneurs/25-most-expensive-schools-worth-every-penny")
    URL.add_header('accept-encoding','identity')
    resp = urllib.request.urlopen(URL)
    

    您当然可以尝试自己使用 python 解压缩 gzipped 响应(这是可能的),但您最好的选择是使用其他库(如果可以)来检索 url,例如 requests。您可以从命令行使用 pip 安装requests

    pip3 install requests
    

    然后在您的代码中检索 URL:

    import requests
    
    URL = requests.get("http://www3.forbes.com/entrepreneurs/25-most-expensive-schools-worth-every-penny/26/")
    soup = BeautifulSoup(URL.text,'lxml')
    
    print(soup.text)
    

    不过,它会输出一些 javascript 代码,而不仅仅是来自网站的文本。

    也可以使用硒,就像其他答案所暗示的那样。但是,当您需要在站点中实际执行 javascript 或像使用浏览器一样与它进行交互时,selenium 更适用于这种情况。所以如果你只需要检索一些静态文本,urllib或者requests就是你要使用的东西,它会更轻量级。

    【讨论】:

    【解决方案2】:

    我花了一年半的时间试图弄清楚美丽汤中的编码,但没有找到任何正确的答案。 当我发现 selenium 和 selenium.webdriver 时,我放弃了这个库。

    from selenium import webdriver
    driver   = webdriver.Chrome() 
    driver.get(url)
    driver.find_element_by_id("<tag id>")
    

    这只是一种乐趣:http://www.seleniumhq.org/projects/webdriver/

    【讨论】:

      猜你喜欢
      • 2018-12-12
      • 2011-10-26
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多