BeautifulSoup

1、BeautifuSoup 是什么

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

 安装:

  pip3 install beautifulsoup4

用法讲解

 

解析器  使用方法优势劣势
python标准库BeautifulSoup('带解析代码','html.parser')python内置标准库容错内里差
lxml HTML解析器BeautilfulSoup('带解析代码','lxml')速度快、文档容错能力强需要安装C语言库
lxml XML解析库 BeautifulSoup('带解析代码','xml')速度快、唯一支持xml的解析器需要安装C语言库
html5libBeautifulSout('带解析代码','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)  //输出这个标签内部的全部标签及内容
输出:
['\n', <title>标题</title>, '\n', <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())
输出:

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值