无法找出美丽的汤对象的编码

时间:2016-11-20 18:01:18

标签: python encoding

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

使用lxml解析网站会返回乱码和奇怪的字符,其他解析器根本不会返回任何内容。我已经尝试将编码指定为UTF-8以匹配网站<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)

2 个答案:

答案 0 :(得分:2)

你看到的是乱码不是因为BeautifulSoup或字符串编码,而是因为urllib和服务器的内容 - 编码。来自服务器的respone标头包括:

  

内容编码:gzip

通常默认情况下,如果在检索网址时发送到服务器的 Accept-encoding 标头为空,则服务器应该压缩内容。但是,出于某种原因,您访问的服务器并不关心这一点,并将其发送到gzipped aynway。即使标题明确设置为'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解压缩gzip响应(这是可能的),但你最好的选择是使用其他一些库(如果可以的话)来检索网址,比如requests 。您可以从命令行使用pip安装requests

pip3 install requests

然后在代码中检索网址:

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或者请求就是您要使用的东西,它将更轻量级。

答案 1 :(得分:0)

我花了一年半的时间试图在美丽的汤中找出编码,却没有找到正确的答案。 当我发现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/