慕斯王
为了完整起见,BeautifulSoup 4版本也使用了服务器提供的编码:from bs4 import BeautifulSoupimport urllib2
resp = urllib2.urlopen("http://www.gpsbasecamp.com/national-parks")soup = BeautifulSoup(resp, from_encoding=resp.info().
getparam('charset'))for link in soup.find_all('a', href=True):
print link['href']或者Python 3版本:from bs4 import BeautifulSoupimport urllib.request
resp = urllib.request.urlopen("http://www.gpsbasecamp.com/national-parks")soup = BeautifulSoup(resp, from_encoding=resp.info().
get_param('charset'))for link in soup.find_all('a', href=True):
print(link['href'])和使用requests图书馆,它将在Python 2和3中运行:from bs4 import BeautifulSoupfrom bs4.dammit import EncodingDetectorimport requests
resp = requests.get("http://www.gpsbasecamp.com/national-parks")http_encoding = resp.encoding if 'charset' in resp.headers.
get('content-type', '').lower() else Nonehtml_encoding = EncodingDetector.find_declared_encoding(resp.content, is_html=True)
encoding = html_encoding or http_encoding
soup = BeautifulSoup(resp.content, from_encoding=encoding)for link in soup.find_all('a', href=True):
print(link['href'])这个soup.find_all('a', href=True)呼叫找到所有元素具有href属性;跳过不带属性的元素。BeautifulSoup 3在2012年3月停止了开发,新项目应该始终使用BeautifulSoup 4。请注意,您应该保留从字节中解码HTML敬美丽汤..您可以通知BeautifulSoup在HTTP响应头中找到的字符集,以帮助解码,但是能,会,可以与在HTML本身中找到标题信息,这就是上面使用BeautifulSoup内部类方法的原因EncodingDetector.find_declared_encoding()以确保这样的嵌入式编码提示赢得了错误配置的服务器。带着requests,response.encoding属性默认为拉丁语-1,如果响应具有text/*mimetype,即使没有返回字符。这与HTTPRFCs是一致的,但与HTML解析一起使用时却很痛苦,因此当没有时,您应该忽略该属性。charset在内容类型标头中设置。