python爬虫之解析库Beautiful Soup

Posted 睡觉的阿狸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python爬虫之解析库Beautiful Soup相关的知识,希望对你有一定的参考价值。

Beautiful Soup4操作

为何要用Beautiful Soup

  Beautiful Soup是一个可以从HTMLXML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式,

  是一个标签的形式,来进行查找的,有点像jquery的形式。提升效率,我们在进行爬虫开发的时候,进程会用到正则来进行查找过滤的操作,纯手动会及其浪费时间。

Beautiful Soup示例摘自官网

html_doc = """
<html><head><title>The Dormouse‘s story</title></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 href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

这里先简单说明Beautiful Soup的查找方式,是一个标签树的形式。

在使用的时候实例化一个对象,这个对象就相当于整个html文件,将标签封装成对象的属性,查找的时候使用“.”

下面进行操作:

  简单操作

from bs4 import BeautifulSoup
soup = BeautifulSoup(open("html_doc.html"),"lxml")
#简单的操作
#打印html文件的title属性
#print(soup.title)
#<title>The Dormouse‘s story</title>

#打印标签的名字
# print(soup.title.name)
#title

# 打印标签的内容
# print(soup.title.string)
#The Dormouse‘s story

#打印soup中的p标签,但是这里是能找到的第一个
# print(soup.p)
# <p class="title"><b>The Dormouse‘s story</b></p>

#打印soup中的p标签class名字,但是这里是能找到的第一个
# print(soup.p[‘class‘],type(soup.p[‘class‘]))
# [‘title‘] <class ‘list‘> #类型是个列表

# 打印soup中的a标签,但是这里是能找到的第一个
# print(soup.a)
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>

#打印所有的a标签
# print(soup.find_all(‘a‘))
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

#打印id=link3的标签
# print(soup.find(id="link3"))
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

#从文档中找到所有<a>标签的链接:
# for link in soup.find_all(‘a‘):
#     print(link.get(‘href‘))
    # http://example.com/elsie
    # http://example.com/lacie
    # http://example.com/tillie

# 从文档中获取所有文字内容:
# print(soup.get_text())
# The Dormouse‘s story
#
# The Dormouse‘s story
#
# Once upon a time there were three little sisters; and their names were
# Elsie,
# Lacie and
# Tillie;
# and they lived at the bottom of a well.
#
# ...

Tag

soup1 = BeautifulSoup(<b class="boldest">Extremely bold</b>,"lxml")
tag = soup1.b  
# print(type(tag))
# <class ‘bs4.element.Tag‘>

Tag的Name属性

# print(tag.name)
# b
# 如果改变了tag的name,那将影响所有通过当前Beautiful Soup对象生成的HTML文档:

# tag.name = "blockquote"
# print(tag)
# <blockquote class="boldest">Extremely bold</blockquote>

Tag的Attributes属性

 

一个tag可能有很多个属性. tag <b class="boldest"> 有一个 “class” 的属性,值为 “boldest” . tag的属性的操作方法与字典相同:
# print(tag[‘class‘])
# [‘boldest‘]

# 也可以直接”点”取属性, 比如: .attrs :
# print(tag.attrs)
# {‘class‘: [‘boldest‘]}
# print(soup.a.attrs[‘class‘])
# [‘sister‘]
# tag的属性可以被添加,删除或修改. 再说一次, tag的属性操作方法与字典一样

# tag[‘class‘] = ‘verybold‘
# tag[‘id‘] = 1
# print(tag)
# <blockquote class="verybold" id="1">Extremely bold</blockquote>

# del tag[‘class‘]
# del tag[‘id‘]
# print(tag)
# <blockquote>Extremely bold</blockquote>

# tag[‘class‘]
# KeyError: ‘class‘
# print(tag.get(‘class‘))
# None
 

 

子节点操作:

  .contents属性

#.contents
# tag的 .contents 属性可以将tag的子节点以列表的方式输出:
# print(soup)
#print(soup.contents) #这里打印的是整个html标签
#print("________")
#print(soup.head.contents) #打印出来的是head下的列表,可以借助元组去重
##[‘
‘, <meta charset="utf-8"/>, ‘
‘, <title>The Dormouse‘s story</title>, ‘
‘]
#print(len(soup.head.contents))
##5
#print(soup.head.contents[1].name)
##meta


 

 

 

 

 

解释器:

  

解析器使用方法优势劣势
Python标准库 BeautifulSoup(markup, "html.parser")
  • Python的内置标准库
  • 执行速度适中
  • 文档容错能力强
  • Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
lxml HTML 解析器 BeautifulSoup(markup, "lxml")
  • 速度快
  • 文档容错能力强
  • 需要安装C语言库
lxml XML 解析器

BeautifulSoup(markup, ["lxml-xml"])

BeautifulSoup(markup, "xml")

  • 速度快
  • 唯一支持XML的解析器
  • 需要安装C语言库
html5lib BeautifulSoup(markup, "html5lib")
  • 最好的容错性
  • 以浏览器的方式解析文档
  • 生成HTML5格式的文档
  • 速度慢
  • 不依赖外部扩展

  

 

 

 

 

  

 

以上是关于python爬虫之解析库Beautiful Soup的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫之Beautiful Soup库,基本使用以及提取页面信息

python爬虫之Beautiful Soup库,基本使用以及提取页面信息

Python爬虫之Beautiful Soup

爬虫之Beautiful Soup

Python 爬虫 解析库的使用 --- Beautiful Soup

2017.08.11 Python网络爬虫实战之Beautiful Soup爬虫