ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

学习爬虫第六天 BS4

2020-02-06 19:39:44  阅读:261  来源: 互联网

标签:soup BS4 标签 tr 爬虫 第六天 href print select


学习爬虫第六天 BS4

1. bs4安装

pip install bs4

2. bs4 简介

bs4全名: Beautiful Soup
Github地址: 官方连接

3. 基本使用

示例:

from bs4 import BeautifulSoup

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对象
soup = BeautifulSoup(html_doc, 'html.parser')

print(type(soup))

print(soup)

3-1. 常用方法

方法 说明
.find() 获取一个对应标签的值(获取到首个后便停止)
.find_all() 获取所有对应标签的值(后面添加[ 0 ],可获取对应位置的标签)

tips:
该方法获取的值是list,故可以进行切片;
方法示例:

from bs4 import BeautifulSoup

html_doc = """
<table class="tablelist" cellspacing="0" cellpadding="0">
    <tbody>
        <tr class="h">
            <td class="1" width="374">职位名称</td>
            <td>职位类别</td>
            <td>人数</td>
            <td>地点</td>
            <td>发布时间</td>
        </tr>
        <tr class="even">
            <td class="l"><a href="https://www.baidu.com">区块链高级研发工程师</a></td>
            <td class="l">技术类</td>
            <td class="l">1</td>
            <td class="l">深圳</td>
            <td class="l">2018-11-25</td>
        </tr>
        <tr class="even">
            <td><a href="https://www.qq.com">金融云高级后台开发</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2018-11-24</td>
        </tr>
    </tbody>
</table>
"""

soup = BeautifulSoup(html_doc, 'lxml')

tdf = soup.find('td').parent

#  1.获取所有tr标签
trs = soup.find_all('tr')
trs = soup.find('tr')
print(trs)

# 4.将所有id等于test,class也等于test的a标签提取出来
alist = soup.find_all('a', attrs={"id": "test", "class": "test"})
alist = soup.find_all('a', id="test", class_="test")
print(alist)

# 3.获取所有的a标签的href属性
hrefs = soup.find_all('a')
for a in hrefs:
    print(a)
    # 1.通过下表的方式
    href = a['hrefs']
    如果没有取到返回None
    href = a.get('hrefs')
    print(href)
    # 2.通过attrs属性的方式
    href = a.attrs['hrefs']
    print(href)

# 6.获取所有的职位信息(纯文本)
trs = soup.find_all('tr')[1:]
for tr in trs:
    print(tr)
    tds = tr.find_all('td')
    print(tds)
    title = tds[0]
    print(title.string)

    获取tr标签的所有文本
    infos = list(tr.strings)
    print(infos)

    可以去除空格取纯文本
    infos = list(tr.stripped_strings)
    print(infos[0])

3-2. 解析器

3-2-1. Python标准库

使用方法: BeautifulSoup(markup, "html.parser")
优势与劣势:

优势 劣势
1. Python的内置标准库 2.执⾏速度适中 3.⽂ 档容错能⼒强 Python 2.7.3 or 3.2.2)前 的版本中⽂档 容错能⼒差

3-2-2. lxml HTML 解析库

使用方法: BeautifulSoup(markup, "lxml")
优势与劣势:

优势 劣势
1.速度快 2.⽂档容错能 ⼒强 需要安装C语⾔库

4. CSS常用选择器介绍

4-1. 查找常用的方法

通过标签名查找:

print(soup.select('a'))

通过类名查找:

print(soup.select('.sister')) 查找class=sister的标签

通过ID查找:

print(soup.select("#link1"))

组合查找: 组合查找即和写 class ⽂件时,标签名与类名、id名进⾏的组合原理是⼀样 的,例如查找 p 标签中,id 等于 link1的内容,⼆者需要⽤空格分开:

print(soup.select("p #link1"))

直接子标签查找,则使用 > 分隔:

print(soup.select("head > title"))

通过属性查找:

print(soup.select('a[href="http://example.com/elsie"]'))

4-2. 获取内容

get_text()方法 获取内容
tips:以上的 select ⽅法返回的结果都是列表形式,可以遍历形式输出。

4-3. select和css选择器提取元素

示例html:

html_doc = """
<table class="tablelist" cellspacing="0" cellpadding="0">
    <tbody>
        <tr class="h">
            <td class="1" width="374">职位名称</td>
            <td>职位类别</td>
            <td>人数</td>
            <td>地点</td>
            <td>发布时间</td>
        </tr>
        <tr class="even">
            <td class="l"><a href="https://www.baidu.com">区块链高级研发工程师</a></td>
            <td class="l">技术类</td>
            <td class="l">1</td>
            <td class="l">深圳</td>
            <td class="l">2018-11-25</td>
        </tr>
        <tr>
            <td><a href="https://www.qq.com">金融云高级后台开发</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2018-11-24</td>
        </tr>
        <tr>
            <td><a href="https://www.zero.com">高级研发工程师</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2018-11-24</td>
        </tr>
        <tr>
            <td><a href="https://www.python.com">高级图像算法工程师</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2018-11-24</td>
        </tr>
        <tr>
            <td><a href="https://www.llp.com" id="test" class="test">高级业务运维工程师</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2018-11-24</td>
        </tr>
    </tbody>
</table>
"""

使用方法示例:

from bs4 import BeautifulSoup


soup = BeautifulSoup(html_doc, 'lxml')

# 1.获取所有tr标签
trs = soup.select('tr')
print(trs)

# 2.获取第2个tr标签
tr = soup.select('tr')[1]
print(tr)

# 3.获取所有class等于even的tr标签
tr = soup.select('tr.even')
print(tr)

# 4.获取所有的a标签的href属性
alist = soup.select('a')
for a in alist:
    href = a.get('href')
    print(href)

# 5.获取所有的职位信息(纯文本)
trs = soup.select('tr')

for tr in trs:
    infos = list(tr.stripped_strings)
    print(infos)

5. bs4 四大对象

四大对象:

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

6. 遍历文档树

  • contents 返回所有子节点的列表
  • children返回所有⼦节点的迭代器
魔力军 发布了23 篇原创文章 · 获赞 3 · 访问量 680 私信 关注

标签:soup,BS4,标签,tr,爬虫,第六天,href,print,select
来源: https://blog.csdn.net/weixin_45550881/article/details/104199967

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有