Python学习笔记:BeautifulSoup模块

Python学习笔记:BeautifulSoup模块

BeautifulSoup最主要的功能是从网站上抓取数据,与正则表达式不同的是:BeautifulSoup是通过html标签来获取所需数据,包括标签、属性、内容。通常,两种方式结合起来,对于抓取数据,可以说是无往不利。
BeautifulSoup支持python标准库的解析器,同时还会支持一些第三方的解析器。如果不安装,则会使用python默认的解析器。

创建BeautifulSoup对象

from bs4 import BeautifulSoup as BS

page = '''
<html>
<head>
<title>BeautifulSoup</title>
</head>
<body>
<p class = "css1">line1</p><p class = "css2">line2</p>
<a href="http://test.com/" id = "link1">line3</a>
<a href="http://test.com/" id = "link2">line4</a>
</body>
</html>
'''
创建BeautifulSoup对象
soup = BS(page,'lxml')

#UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

按html标准格式输出
print(soup.prettify())

BeautifulSoup的四种对象
• Tag(标签)
• NavigableString(标签内部内容)
• BeautifulSoup(BS对象)
• Comment(特殊的NavigableString对象)

BeautifulSoup对象

print(type(soup)) 
#<class 'bs4.BeautifulSoup'> BeautifulSoup对象和Tag对象有些类似,同样具有name、attrs属性

print(soup.name) 
#[document] BeautifulSoup对象的name值为document

print(soup.attrs) 
#{} 返回空dict

print(type(soup.strings)) 
#<class 'generator'> 返回一个内容生成器,注释的内容将不会被打印出来

for i in soup.strings:
    print(i)

print(type(soup.stripped_strings)) 
#<class 'generator'> 返回一个内容生成器,与strings不同的是,stripped_strings会去掉无用的回车
for i in soup.stripped_strings:
    print(i)

Tag对象

print(soup.head)
#<head><title>BeautifulSoup</title></head> 结果为首尾标签中的全部内容

print(type(soup.head)) 
#<class 'bs4.element.Tag'> 对象类型为'bs4.element.Tag

tag对象有两个重要属性,一个是name,另一个是attrs

print(soup.a.name) 
#a 打印结果为标签名称

print(soup.a.attrs) 
#{'id': 'link1', 'href': 'http://test.com/'} 返回结果为字典,里面包含属性及属性值的键值对

print(soup.a['id']) 
#link1 返回属性值

NavigableString对象

print(soup.a.string) 
#line3 返回该标签内容

print(soup.body.string) 
#None 如果该标签含有多个子标签,则会返回None,如果只含有一个含有NavigableString对象的子标签,则反对该子标签内容

print(type(soup.a.string)) 
#<class 'bs4.element.NavigableString'>

Comment对象

print(soup.p.string) 
#line1 只显示注释内容,并不显示注释符号,名副其实的“comment”

print(type(soup.p.string)) 
#<class 'bs4.element.Comment'> 发现没有,soup.p.string的类型不是NavigableStrin,而是Comment?那是因为标签内容中含有注释语句,自动识别类型为Comment
print(soup.head.contents) 
#[<title>BeautifulSoup</title>] 按首尾标签分割成为list的元素

print(soup.head.contents[0])
#<title>BeautifulSoup</title> 可以由索引直接读取首尾标签

访问子节点

print(soup.body.children) 
#<list_iterator object at 0x0000000002C3C668> 返回的是一个list的生成器,可以通过循环遍历得到结果
for i in soup.body.children:
    print(i)

访问父节点

print(soup.title.parent.name) 
#head 返回父节点

print(soup.p.parents) 
#<generator object parents at 0x00000000030A2EA0> 返回一个生成器,包含该标签所有的父级标签
for i in soup.p.parents:
    print(i.name) #依次返回body、html、[document]

访问兄弟节点

print(soup.p.next_sibling) 
#<p class="css2"><!-- line2 --></p>

print(soup.p.previous_sibling) 
#空白和换行同样被视为一个节点,因此会输出空白

#.next_siblings 和 .previous_siblings 属性可以对当前节点的兄弟节点迭代输出

访问前后节点

print(soup.title.next_element) 
# <h1>BeautifulSoup</h1> 等同于soup.h1

print(soup.title.previous_element) 
#<head><title><h1>BeautifulSoup</h1></title></head> 等同于soup.head

#.next_elements 和 .previous_elements 的可以生成迭代器,用以访问节点以前或以后的所有节点

遍历节点树

print(soup.find_all('h1')) 
#[<h1>BeautifulSoup</h1>, <h1>line3</h1>]返回所有符合标签

传递正则表达式

for tag in soup.find_all(re.compile(r'^h')):
    print(tag.name) 
    #[<h1>BeautifulSoup</h1>, <h1>line3</h1>]

css选择器

print(soup.select('title'))
#[<title><h1>BeautifulSoup</h1></title>]通过标签名查找,返回一个列表

print(soup.select('.css1'))
#[<p class="css1"><!-- line1 --></p>]通过标签名查找,返回一个列表

print(soup.select('#link1'))
#[<a href="http://test.com/" id="link1"><h1>line3</h1></a>]通过id名查找,返回一个列表

print(soup.select('a .#link1'))
#[] 通过组合查找,返回一个列表

print(soup.select('head > title'))
#[<title><h1>BeautifulSoup</h1></title>]通过子标签直接查找,返回一个列表

print(soup.select(r'a[id="link1"]')) 
#[<a href="http://test.com/" id="link1"><h1>line3</h1></a>] 通过属性查找,返回一个列表
发布了2 篇原创文章 · 获赞 0 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/u010620031/article/details/50965707
今日推荐