转:https://zhuanlan.zhihu.com/p/26701898
# -*- coding: utf-8 -*-
import bs4
#使用lxml方式
soup=bs4.BeautifulSoup(open("demo.html"),"lxml")
print soup.prettify()
'''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
</head>
<body>
<p class="title">
<b>
The Dormouse's story
</b>
</p>
<p class="story">
Once upon a time there were three little sisters; and their names were
<a class="sister" href="http://example.com/elsie" id="link1">
Elsie
</a>
,
<a class="sister" href="http://example.com/lacie" id="link2">
Lacie
</a>
and
<a class="sister" href="http://example.com/tillie" id="link3">
Tillie
</a>
;
and they lived at the bottom of a well.
</p>
<p class="story">
...
</p>
</body>
</html>
'''
#设置编码格式
'''
如何具体的使用?
bs4 库首先将传入的字符串或文件句柄转换为 Unicode的类型,这样,我们在抓取中文信息的时候,就不会有很麻烦的编码问题了。
当然,有一些生僻的编码 如:‘big5’,就需要我们手动设置编码:
soup = BeautifulSoup(markup, from_encoding="编码方式")
'''
#内容解析
'''
对象的种类:
bs4 库将复杂的html文档转化为一个复杂的树形结构,每个节点都是Python对象 ,所有对象可以分为以下四个类型:
Tag , NavigableString , BeautifulSoup , Comment
我们来逐一解释:
Tag: 和html中的Tag基本没有区别,可以简单上手使用
NavigableString: 被包裹在tag内的字符串
BeautifulSoup: 表示一个文档的全部内容,大部分的时候可以吧他看做一个tag对象,支持遍历文档树和搜索文档树方法。
Comment:这是一个特殊的NavigableSting对象,在出现在html文档中时,会以特殊的格式输出,比如注释类型。
'''
#方法
#获取头信息
print soup.head
'''
<head>
<meta charset="utf-8"/>
</head>
'''
#获取title信息
print soup.title
#获取b标签
print soup.body.b#<b>The Dormouse's story</b>
#获取所有a标签
print soup.findAll('a')
tag=soup.findAll('a')
print tag[1]#<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
#获取节点方式
head_tag=soup.head
print head_tag
print head_tag.contents#[u'\n', <meta charset="unicode-escape"/>, u'\n']
print head_tag.contents[0]#<meta charset="utf-8"/>
content=head_tag.contents[0]
print content.contents#[u"The Dormouse's story"]
#另外通过tag的 .children生成器,可以对tag的子节点进行循环:
for child in content.children:
print child#The Dormouse's story
#这种方式只能遍历出子节点。如何遍历出子孙节点呢?
for child in content.descendants:
print child #The Dormouse's story
#获取页面的所有的文本内容
'''
如果该tag只有一个子节点(NavigableString类型):直接使用tag.string就能找到。
如果tag有很多个子、孙节点,并且每个节点里都string:
'''
for s in soup.strings:
print repr(s)
'''
u"The Dormouse's story"
u"The Dormouse's story"
u' Lacie '
u' Lacie '
u' Lacie '
'''
#官方文档https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/#id12