Python 爬虫 BeautifulSoup4 库的使用
BeautifulSoup4库和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。 安装和文档:
几大解析工具对比:
简单使用:from bs4 import BeautifulSoup html = """ <html><head><title>The Dormouse‘s story</title></head> <body> <p class="title" name="dromouse"><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 对象 # 使用lxml来进行解析 soup = BeautifulSoup(html,"lxml") print(soup.prettify())
四个常用的对象:Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
1. Tag:Tag 通俗点讲就是 HTML 中的一个个标签。示例代码如下: from bs4 import BeautifulSoup html = """ <html><head><title>The Dormouse‘s story</title></head> <body> <p class="title" name="dromouse"><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 对象 soup = BeautifulSoup(html,‘lxml‘) print soup.title # <title>The Dormouse‘s story</title> print soup.head # <head><title>The Dormouse‘s story</title></head> print soup.a # <a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a> print soup.p # <p class="title" name="dromouse"><b>The Dormouse‘s story</b></p> print type(soup.p) # <class ‘bs4.element.Tag‘>
我们可以利用 soup 加标签名轻松地获取这些标签的内容,这些对象的类型是bs4.element.Tag。但是注意,它查找的是在所有内容中的第一个符合要求的标签。如果要查询所有的标签,后面会进行介绍。 print soup.name # [document] #soup 对象本身比较特殊,它的 name 即为 [document] print soup.head.name # head #对于其他内部标签,输出的值便为标签本身的名称 print soup.p.attrs # {‘class‘: [‘title‘],‘name‘: ‘dromouse‘} # 在这里,我们把 p 标签的所有属性打印输出了出来,得到的类型是一个字典。 print soup.p[‘class‘] # soup.p.get(‘class‘) # [‘title‘] #还可以利用get方法,传入属性的名称,二者是等价的 soup.p[‘class‘] = "newClass" print soup.p # 可以对这些属性和内容等等进行修改 # <p class="newClass" name="dromouse"><b>The Dormouse‘s story</b></p>
2. NavigableString:如果拿到标签后,还想获取标签中的内容。那么可以通过 print soup.p.string # The Dormouse‘s story print type(soup.p.string) # <class ‘bs4.element.NavigableString‘>thon
3. BeautifulSoup:BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,它支持 遍历文档树 和 搜索文档树 中描述的大部分的方法. soup.name
# ‘[document]‘
4. Comment:Tag,NavigableString,BeautifulSoup 几乎覆盖了html和xml中的所有内容,但是还有一些特殊对象.容易让人担心的内容是文档的注释部分: markup = "<b><!--Hey,buddy. Want to buy a used parser?--></b>" soup = BeautifulSoup(markup) comment = soup.b.string type(comment) # <class ‘bs4.element.Comment‘>
Comment 对象是一个特殊类型的 NavigableString 对象: comment
# ‘Hey,buddy. Want to buy a used parser‘
遍历文档树:1. contents和children:html_doc = """ <html><head><title>The Dormouse‘s story</title></head> <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> """ from bs4 import BeautifulSoup soup = BeautifulSoup(html_doc,‘lxml‘) head_tag = soup.head # 返回所有子节点的列表 print(head_tag.contents) # 返回所有子节点的迭代器 for child in head_tag.children: print(child)
2. strings 和 stripped_strings如果tag中包含多个字符串 [2],可以使用 .strings 来循环获取: for string in soup.strings: print(repr(string)) # u"The Dormouse‘s story" # u‘nn‘ # u"The Dormouse‘s story" # u‘nn‘ # u‘Once upon a time there were three little sisters; and their names weren‘ # u‘Elsie‘ # u‘,n‘ # u‘Lacie‘ # u‘ andn‘ # u‘Tillie‘ # u‘;nand they lived at the bottom of a well.‘ # u‘nn‘ # u‘...‘ # u‘n‘
输出的字符串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多余空白内容: for string in soup.stripped_strings: print(repr(string)) # u"The Dormouse‘s story" # u"The Dormouse‘s story" # u‘Once upon a time there were three little sisters; and their names were‘ # u‘Elsie‘ # u‘,‘ # u‘Lacie‘ # u‘and‘ # u‘Tillie‘ # u‘;nand they lived at the bottom of a well.‘ # u‘...‘
搜索文档树:1. find和find_all方法:搜索文档树,一般用得比较多的就是两个方法,一个是 soup.find_all("a",attrs={"id":"link2"})
或者是直接传入属性的的名字作为关键字参数: soup.find_all("a",id=‘link2‘)
2. select方法:使用以上方法可以方便的找出元素。但有时候使用 (1)通过标签名查找:print(soup.select(‘a‘))
(2)通过类名查找:通过类名,则应该在类的前面加一个 print(soup.select(‘.sister‘))
(3)通过id查找:通过id查找,应该在id的名字前面加一个#号。示例代码如下: print(soup.select("#link1"))
(4)组合查找:组合查找即和写 class 文件时,标签名与类名、id名进行的组合原理是一样的,例如查找 p 标签中,id 等于 link1的内容,二者需要用空格分开: print(soup.select("p #link1"))
直接子标签查找,则使用 > 分隔: print(soup.select("head > title"))
(5)通过属性查找:查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。示例代码如下: print(soup.select(‘a[href="http://example.com/elsie"]‘))
(6)获取内容以上的 select 方法返回的结果都是列表形式,可以遍历形式输出,然后用 get_text() 方法来获取它的内容。 soup = BeautifulSoup(html,‘lxml‘) print type(soup.select(‘title‘)) print soup.select(‘title‘)[0].get_text() for title in soup.select(‘title‘): print title.get_text()
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |