您当前的位置:首页 > 计算机 > 编程开发 > Python

python爬虫7--BeautifulSoup解析库

时间:05-19来源:作者:点击数:

1. BeautifulSoup介绍

HTML或XML的解析库。支持的解析器有:

  • python标准库:BeautifulSoup(markup."html.parser');执行速度适中,容错能力强;python2.7.3及python3.2.2之前版本容错能力差;
  • lxml HTML解析器:BeautifulSoup(markup."lxml');速度快容错能力强;推荐使用;
  • lxml XML解析库:BeautifulSoup(markup."xml');速度快,只支持XML;
  • html5lib:BeautifulSoup(markup."html5lib');最好的容错器,以浏览器的方式解析,生成html5文档,但速度慢。

2. 初始化解析

2.1 解析HTML文本:

from bs4 import BeautifulSoup

soup = BeautifulSoup(res.text,'lxml')
print(soup.prettify())   #prettify()方法将要解析的字符串以标准的缩进格式输出

2.2 解析本地文件:

from bs4 import BeautifulSoup

soup = BeautifulSoup(open('./test.html',encoding='utf-8','lxml')
print(soup.prettify())   #prettify()方法将要解析的字符串以标准的缩进格式输出

3.节点选择器

本地Html文件:

<head>
    <meta charset="UTF-8">
    <title>The Dormouse's story</title>
</head>
<body>
    <p class="title" name="dormouse"><b>The Dormouse's story</b></p>
    <p class="story">there name were
        <a href="http://elsie" class="sister" id="link1"><span>Elsie</span></a>,
        <a href="http://lacie" class="sister" id="link2">Lacie</a>and
        <a href="http://tillie" class="sister" id="link3">Tillie</a>;
        and they lived at the bottom of a well.</p>
    <p class="story">...</p>
</body>
from bs4 import BeautifulSoup
import lxml
soup = BeautifulSoup(open('./test.html',encoding='utf-8'),'lxml')

3.1 选择元素

print(soup.title)   #title标签加文字内容
print(type(soup.title))   #<class 'bs4.element.Tag'>
print(soup.title.string)  #利用Tag对象的string属性获取文本内容
print(soup.p)    #当有多个节点时值匹配到第一个

3.2 提取信息 3.2.1 获取节点名称

print(soup.title.name)

3.2.2 获取属性

print(soup.p.attrs)   #获取p节点的所有属性和值,结果字典形式
print(soup.p.attrs['name'])   #获取p节点name属性的值

更简洁的方式

print(soup.p['class'])       #一个节点元素可能有多个class,所以返回列表
print(soup.p['name'])

3.3获取内容

print(soup.p.string)

3.1 嵌套使用

print(soup.head.title.string)  #如果返回的为Tag对象可以继续调用节点进行选择

3.2.1 关联选择,子节点和子孙节点

print(soup.p.contents)   #返回直接子节点的列表
print(soup.p.children)    #返回直接子节点的生成器,需迭代输出
for child in enumerate(soup.p.children):
    print(child)
print(soup.p.descendants)    #返回所有子孙节点的生成器,需迭代输出
for child in enumerate(soup.p.descendants):
    print(child)

3.2.2 关联选择,父节点和子孙节点

print(soup.a.parent)    #直接父节点
print(list(enumerate(soup.a.parents)))    #所有祖先节点,返回生成器

3.2.3 关联选择,兄弟节点

print(soup.a.next_sibling)   #下一个节点元素
print(soup.a.previous_sibling)  #上一个节点元素
print(list(enumerate(soup.a.next_siblings) ))  #后面所有节点元素的生成器
print(soup.a.previous_siblings)  #前面所有节点元素的生成器

3.2.4 关联选择,提取信息

print(list(soup.a.parents)[0])   #用列表索引或信息提取方法来提取

4.方法选择器

本地HTML代码:

<body>
  <ul class="list">
      <li class="first" name="dennisz" id="one">桃花影落飞神剑</li>
      <li class="hehe">我心已向大海</li>
      <li title="third line">碧海潮生按玉箫</li>
      <li>笑书神侠倚碧鸳</li>
      <a href="http://www.baidu.com">金庸</a>
   </ul>
   <div class="xixi">
      <ul>
         <!-- 这是一个注释 -->
         <li class="second" id="two">谁管世间满风浪</li>
         <li class="haha">仗剑匹马走天涯</li>
         <li id="yoyoyo">笑傲江湖成绝响</li>
         <li class="ok" id="no">人间再无侠客行</li>
         <div>
            <li>令狐</li>
            <li>任我行</li>
            <li>盈盈</li>
            <li>东方不败</li>
            <li>左冷禅</li>
            <li>岳不群</li>
         </div>
      </ul>
      <d>
         <a href="http://www.taobao.com">绝世秘籍</a>
      </d>
   </div>
</body>

4.1 通过节点名称查询

print(soup.find_all('li'))   #返回所有li标签,结果以列表形式
print(soup.find_all('li',limit=3))  #限制条数
print(soup.find_all(['li','a']))   #返回所有的li或a标签

4.2通过属性查询

print(soup.find_all('li',class_='second'))   #返回class='second'的li标签
print(soup.find_all('li',class_='second')[0].string)

4.3 其他方法

  • find():和find_all()相似,但是只返回第一个匹配到的结果
  • find_parents()和find_parent():所有祖先节点和直接父节点
  • find_next_sublings()和find_next_sublings():后面所有兄弟节点和第一个兄弟节点
  • find_previous_sublings()和find_previous_sublings():前面所有兄弟节点和第一个兄弟节点
  • find_all_next()和find_next():后面所有和后面第一个
  • find_all_previous()和find_previous():前面所有和后面第一个

5.CSS选择器

本地html代码:

<body>
  <ul class="list1">
      <li class="first" name="dennisz" id="one">桃花影落飞神剑</li>
      <li class="hehe">我心已向大海</li>
      <li title="third line">碧海潮生按玉箫</li>
      <li>笑书神侠倚碧鸳</li>
      <a href="http://www.baidu.com">金庸</a>
   </ul>
   <div class="xixi">
      <ul class="list2">
         <!-- 这是一个注释 -->
         <li class="second" id="two">谁管世间满风浪</li>
         <li class="haha">仗剑匹马走天涯</li>
         <li id="yoyoyo">笑傲江湖成绝响</li>
         <li class="ok" id="no">人间再无侠客行</li>
         <div>
            <li>令狐</li>
            <li>任我行</li>
            <li>盈盈</li>
            <li>东方不败</li>
            <li>左冷禅</li>
            <li>岳不群</li>
         </div>
      </ul>
      <d>
         <a href="http://www.taobao.com">绝世秘籍</a>
      </d>
   </div>
</body>

5.1 根据标签查找

print(soup.select('li'))   #所有li标签
根据class属性查找
print(soup.select('.list'))
print(soup.select('li[class="hehe"]'))
根据id查找
print(soup.select('#two'))
print(soup.select('li[id="no"]'))

5.2 嵌套查找

for ul in soup.select('ul'):
    print(ul.select('li'))

5.3 获取属性

for ul in soup.select('ul'):
    print(ul['class'])    #两种方法都可以
    print(ul.attrs['class'])

5.4获取文本

for li in soup.select('li'):
    print(li.text)   #三种方法都可以
    print(li.string)
    print(li.get_text())
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门