BeautifulSoup

1、BeautifuSoup 是什么

灵活又方便的网页解析库,处理高效,支持多种解析器,利用它不用编写正则表达式既可方便地实现网页信息的提取。

 安装:

  pip3 install beautifulsoup4

用法讲解

解析器   使用方法 优势 劣势
python标准库 BeautifulSoup('带解析代码','html.parser') python内置标准库 容错内里差
lxml HTML解析器 BeautilfulSoup('带解析代码','lxml') 速度快、文档容错能力强 需要安装C语言库
lxml XML解析库  BeautifulSoup('带解析代码','xml') 速度快、唯一支持xml的解析器 需要安装C语言库
html5lib BeautifulSout('带解析代码','html5lib') 最好的容错性、以浏览器的方式解析文档,生成html5格式的文档 速度快、不依赖外部扩展

来个栗子

from bs4 import BeautifulSoup
html ="""<ul id="navList">
    <li><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li>
    <li><a id="MyLinks1_SpaceLink" class="menu" href="http://ing.cnblogs.com/">闪存</a></li>
    <li><a id="blog_nav_myhome" class="menu" href="http://www.cnblogs.com/youmingkuang/">首页</a></li>
    <li><a id="blog_nav_newpost" class="menu" rel="nofollow" href="https://i.cnblogs.com/EditPosts.aspx?opt=1">新随笔</a></li>
    <li><a id="blog_nav_contact" accesskey="9" class="menu" rel="nofollow" href="https://msg.cnblogs.com/send/%E5%B9%BD%E5%86%A5%E7%8B%82_%E4%B8%83">联系</a></li>
    <li><a id="blog_nav_admin" class="menu" rel="nofollow" href="https://i.cnblogs.com/">管理</a></li>
    <li><a id="blog_nav_rss" class="menu" href="http://www.cnblogs.com/youmingkuang/rss">订阅</a>
        <a id="blog_nav_rss_image" class="aHeaderXML" href="http://www.cnblogs.com/youmingkuang/rss"><img src="//www.cnblogs.com/images/xml.gif" alt="订阅" /></a></li>
</ul>
"""
soup = BeautifulSoup(html,'lxml')
print(soup.prettify())  """格式化代码"""
print(soup.li.string)

2、标签选择器

  1、选择元素

  

from bs4 import BeautifulSoup
html ="""<ul id="navList">
    <title>标题</title>
    <header>大脑袋</header>
    <li name="dromouse"><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li>
    <li name="dromouse1"><a id="MyLinks1_SpaceLink" class="menu" href="http://ing.cnblogs.com/">闪存</a></li>
    <li><a id="blog_nav_myhome" class="menu" href="http://www.cnblogs.com/youmingkuang/">首页</a></li>
    <li><a id="blog_nav_newpost" class="menu" rel="nofollow" href="https://i.cnblogs.com/EditPosts.aspx?opt=1">新随笔</a></li>
    <li><a id="blog_nav_contact" accesskey="9" class="menu" rel="nofollow" href="https://msg.cnblogs.com/send/%E5%B9%BD%E5%86%A5%E7%8B%82_%E4%B8%83">联系</a></li>
    <li><a id="blog_nav_admin" class="menu" rel="nofollow" href="https://i.cnblogs.com/">管理</a></li>
    <li><a id="blog_nav_rss" class="menu" href="http://www.cnblogs.com/youmingkuang/rss">订阅</a>
        <a id="blog_nav_rss_image" class="aHeaderXML" href="http://www.cnblogs.com/youmingkuang/rss"><img src="//www.cnblogs.com/images/xml.gif" alt="订阅" /></a></li>
</ul>
"""
soup = BeautifulSoup(html,'lxml')
print(soup.title)
print(soup.header)
print(soup.li)

输出:

如果加了.string

print(soup.title.string)
print(soup.header.string)
print(soup.li.string)

 输出就是具体的文字

标题
大脑袋
博客园

 

2、获取名称

soup = BeautifulSoup(html,'lxml')
print(soup.title.name)
输出:
title

3、获取属性

soup = BeautifulSoup(html,'lxml')
print(soup.li.attrs['name'])  //第一种方式
print(soup.li['name'])     //第二种方式
输出:
dromouse
dromuser1

4、嵌套选择

soup = BeautifulSoup(html,'lxml')
print(soup.li.attrs['name'])
print(soup.ul.li.a.string)
输出:
博客园

5、子节点和子孙节点

soup = BeautifulSoup(html,'lxml')
print(soup.li.attrs['name'])
print(soup.ul.contents)  //输出这个标签内部的全部标签及内容
输出:
[' ', <title>标题</title>, ' ', <header>大脑袋</header>, '....<a class="menu" href="http://www.cnblogs.com/youmingkuang/rss" id="blog_nav_rss">订阅</a>

 第二获取子节点:迭代器

soup = BeautifulSoup(html,'lxml')
print(soup.ul.children)
for i,child in enumerate(soup.ul.children):
print(i,child)

 输出:

 

   第三 获取子节点: 子孙节点(迭代器)

soup = BeautifulSoup(html,'lxml')
print(soup.ul.descendants)
for i,child in enumerate(soup.ul.descendants):
print(i,child)
输出:

  6、find_all
soup = BeautifulSoup(html,'lxml')
for ul in soup.find_all('ul'):
print(ul.find_all('li'))
查找出所有ul下面的li标签及其子标签
    

   7、attrs

soup = BeautifulSoup(html,'lxml')
print(soup.find_all(attrs={"id":"blog_nav_admin"}))
print(soup.find_all(attrs={"class":"aHeaderXML"}))
    输出:
    

     或者

print(soup.find_all(id="blog_nav_admin"))
print(soup.find_all(class_="aHeaderXML")) 更加简单

  8、find 是返回单个结果。
  
 9、find_parents() 和 find_parent()

三、CSS 选择器
  
  
soup = BeautifulSoup(html,'lxml')

  print(soup.select('.panal .panel-heading'))

  print(soup.select('ul li'))

  print(soup.select('#list-2 .element'))

  print(soup.select('ul')[0])

 

 获取属性

soup = BeautifulSoup(html,'lxml')
for ul in soup.select('ul'):
print(ul['id'])
print(ul.attrs['id'])

 

 获取内容

soup = BeautifulSoup(html,'lxml')
for ul in soup.select('li'):
print(ul.get_text())
输出:

博客园
闪存
首页
新随笔
联系
管理
订阅

 

 

 

 

 

 

 

 

 

 

 

 

 

 
原文地址:https://www.cnblogs.com/youmingkuang/p/7839680.html