Beautiful Soup库是解析、遍历、维护“标签树”的功能库。

 url = "http://desk.zol.com.cn/"
request = requests.get(url)
html = request.content
soup = BeautifulSoup(html, "html.parser", from_encoding="utf-8")

一.解析器:
1.BeautifulSoup(markup, "html.parser")
2.BeautifulSoup(markup, "lxml")
3.BeautifulSoup(markup, "xml")
4.BeautifulSoup(markup, "html5lib")

二.Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
  Tag , NavigableString , BeautifulSoup , Comment .

1.Tag 标签:
任何存在于HTML语法中的标签都可以用soup.<tag>访问获得。                    
当HTML文档中存在多个相同<tag>对应内容时,soup.<tag>返回第一个。
例如,

soup.a  --->  返回<a>标签的内容;
      soup.a.name  -->  返回<a>标签的名字;
      soup.a.parent.name  -->  返回<a>标签上一层的标签名字;
      soup.a.parent.parent.name

soup.a.attrs  --> 返回<a>标签的所有属性;
      soup.a.attrs['class']  -->  返回<a>标签的class属性;

soup.a.string  --> 返回<a>标签中的非属性内容(也就是<>...</>中的内容); 只能获取一个!

soup.get_text()  -->  获取所有内容;获取标签下所有的文字内容!   soup.get_text(" ", strip=True)可以这样去除空白行;

soup.strings  -->  如果tag中包含多个字符串,可以使用 .strings 来循环获取;

soup.stripped_strings  -->  soup.strings输出的字符串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多余空白内容;

三.基于bs4库的HTML内容遍历方法
      soup.contents
      soup.a.contents  --> 将<a>标签所有子节点存入列表;      
      soup.a.children  -->  与contents类似,但用于循环遍历子节点;
      soup.a.descendants  -->  用于循环遍历子孙节点;
注意:BeautifulSoup 对象本身一定会包含子节点,也就是说<html>标签也是 BeautifulSoup 对象的子节点!

soup.prettify()  -->  让HTML内容更加“友好”的显示,prettify()为HTML文本<>及其内容增加更加'\n'。

四.信息提取
      soup.find_all(name,attrs,recursive,string,**kwargs)
        name:对标签名称的检索;
        attrs:对标签属性值的检索;
        recursive:是否对子孙全部检索,默认为True;
        string: <>...</>中字符串区域的检索。

例如,soup.find_all('a')
      soup.find_all(['a','b'])

注意:find_all()中可以使用正则表达式来检索特定内容!
      soup.find_all(re.compile(r'^a'))

例一:

 import requests
from bs4 import BeautifulSoup request = requests.get("http://www.163hnzk.com/index_pc.php")
html = request.content
soup = BeautifulSoup(html, "html.parser", from_encoding="utf-8")
spans = soup.find_all(name='span', attrs={'class': 'newstitle'}) hrefs = []
for href in spans:
hrefs.append(href.a.attrs['href']) for url in hrefs:
# 因为url含有特殊字符不能创建文件,所以split去掉特殊字符
with open("E:\%s" % url.split('?')[1], "wb") as f:
# 'wb'所以要用content,‘w’用text
f.write(requests.get("http://www.163hnzk.com/"+url).content)

例二:

 import requests
from bs4 import BeautifulSoup
import pandas as pd #request函数用来解析页面,获取所需内容
def request(number):
header={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'}
html = requests.get("https://hr.tencent.com/position.php?&start="+str(number), headers=header).text
soup = BeautifulSoup(html, 'html.parser', from_encoding='utf-8')
evens = soup.find_all(name='tr', attrs='even')
odds = soup.find_all(name='tr', attrs='odd')
trs = evens+odds
for tr in trs:
dct={}
dct["职位名称"]=tr.select('td a')[0].get_text()
dct["职位类别"]=tr.select('td')[1].get_text()
dct["招聘人数"]=tr.select('td')[2].get_text()
dct["工作地点"]=tr.select('td')[3].get_text()
dct["发布时间"]=tr.select('td')[4].get_text()
dct["链接地址"]='http://hr.tencent.com/'+tr.select('td a')[0].attrs['href']
lst.append(dct) #使用pandas保存为excel文件
def read_write(lst):
with open(r'E:\zhaopin.csv', 'w', encoding='utf-8') as f:
#字典列表可作为输入数据传递以创建数据帧(DataFrame),字典键默认为列名。
datafram = pd.DataFrame(lst)
datafram.to_csv(r'E:\zhaopin.csv', index=False) if __name__=="__main__":
number = 0
#lst用来保存抓取的信息
lst=[]
while True:
#只抓取前5页的内容
if number < 50:
request(number)
number = number+10
else:
break
read_write(lst) 结果:


传送门--Beautifulsoup官方文档

BeautifulSoup模块的常用方法小结的更多相关文章

  1. 【爬虫入门手记03】爬虫解析利器beautifulSoup模块的基本应用

    [爬虫入门手记03]爬虫解析利器beautifulSoup模块的基本应用 1.引言 网络爬虫最终的目的就是过滤选取网络信息,因此最重要的就是解析器了,其性能的优劣直接决定这网络爬虫的速度和效率.Bea ...

  2. 【网络爬虫入门03】爬虫解析利器beautifulSoup模块的基本应用

    [网络爬虫入门03]爬虫解析利器beautifulSoup模块的基本应用   1.引言 网络爬虫最终的目的就是过滤选取网络信息,因此最重要的就是解析器了,其性能的优劣直接决定这网络爬虫的速度和效率.B ...

  3. 孤荷凌寒自学python第六十八天学习并实践beautifulsoup模块1

    孤荷凌寒自学python第六十八天学习并实践beautifulsoup模块1 (完整学习过程屏幕记录视频地址在文末) 感觉用requests获取到网页的html源代码后,更重要的工作其实是分析得到的内 ...

  4. unittest模块的常用方法:

    unittest模块的常用方法: assertEqual(a, b)     a == b assertNotEqual(a, b)     a != b assertTrue(x)     bool ...

  5. Python 爬虫三 beautifulsoup模块

    beautifulsoup模块 BeautifulSoup模块 BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查 ...

  6. requsets模块和beautifulsoup模块

    2.requests模块方法 requests是基于Python开发的HTTP库,使用Requests可以轻而易举的完成浏览器可有的任何操作. request.get() request.post() ...

  7. BeautifulSoup 模块详解

    BeautifulSoup 模块详解 BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查找指定元素,从而使得在HT ...

  8. 03 解析库之Beautifulsoup模块

    Beautifulsoup模块   一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式 ...

  9. python中BeautifulSoup模块

    BeautifulSoup模块是干嘛的? 答:通过html标签去快速匹配标签中的内容.效率相对比正则会好的多.效率跟xpath模块应该差不多. 一:解析器: BeautifulSoup(html,&q ...

随机推荐

  1. 【python3基础】命令行参数及 argparse

    目录 命令行参数及 argparse 包 argparse 传递 bool 参数错误做法 argparse 传递 bool 参数正确做法 1 argparse 传递 bool 参数正确做法 2 Ref ...

  2. vue 首次加载缓慢/刷新后加载缓慢 原因及解决方案

    # vue 首次加载缓慢/刷新后加载缓慢 原因及解决方案 最近做项目发现一个问题,页面每次刷新后加载速度都非常慢,20s左右,在开发环境则非常流畅,几乎感觉不到,本文参考望山的各种方案优化 1,关闭打 ...

  3. [springboot 开发单体web shop] 4. Swagger生成Javadoc

    Swagger生成JavaDoc 在日常的工作中,特别是现在前后端分离模式之下,接口的提供造成了我们前后端开发人员的沟通 成本大量提升,因为沟通不到位,不及时而造成的[撕币]事件都成了日常工作.特别是 ...

  4. 搭建邮件服务器,使用Postfix与Dovecot收发电子邮件

    小知识: 我们为什么要搭建邮件服务器呢?有时候我们处于一个局域网内,不能及时的分享各自的研究成果,迫切的需要一种能够借助于网络且建立在计算机之间的传输数据的方法.所以我们需要搭建邮件服务器,这样的话既 ...

  5. 学习笔记31_ORM框架ModelFirst设计数据库

    ModelFirst就是先设计实体数据类型,然后根据设计的数据类型,生成数据库表 1.新建项--ADO.NET实体数据模型--空数据模型--进入模型设计器(点击xxx.edmx文件也能进入设计器). ...

  6. 学习笔记49_Redis

    Redis和memcache区别: 1 . mm是通过客户端驱动实现集群化,Redis是通过服务器配置文件集群 2. redis是可以进行持久化的存储 3. redis提供高级的数据结构,队列,栈都提 ...

  7. Pandas 筛选操作

    # 导入相关库 import numpy as np import pandas as pd 在数据处理过程中,经常会遇到要筛选不同要求的数据.通过 Pandas 可以轻松时间,这一篇我们来看下如何使 ...

  8. Java中打印日志,这4点很重要!

    目录 一.预先判断日志级别 二.避免无效日志打印 三.区别对待错误日志 四.保证记录完整内容 打印日志,要注意下面4点. 一.预先判断日志级别 对DEBUG.INFO级别的日志,必须使用条件输出或者使 ...

  9. P3052 [USACO12MAR]摩天大楼里的奶牛(迭代加深搜索)

    (已经一句话了) 第一反应:暴力 第二反应:朴素算法过不去 第三反应:没法折半暴搜(没法统计答案) 所以,歪歪了一个类似贪心刷表的方法,过了这道题. 首先,如果爆搜的话会有几个状态: 当前牛 当前几个 ...

  10. mysql并发量过大造成 update语句更新错误

    mysql并发量过大造成 update语句更新错误 在同一字段的时候更新的时候 如果并发量太大 就会更新错误 这个时候只能用 swoole 消息队列更新