当前位置: 首页 > news >正文

Python网络爬虫与信息提取(三):网络爬虫之提取(Beautifulsoup bs4)

Beautifulsoup库简介

Beautifulsoup,又叫美丽汤,是一个优秀的python第三方库,能够对html,xml进行解析,并且提取其中的相关信息。

Beautifulsoup的使用原理是他能够吧任何你给他的文档当做一锅汤,然后给你煲制这锅汤

import requests
r =  requests.get('http://python123.io/ws/demo.html')
demo = r.text
from bs4 import BeautifulSoup #from bs4导入了 一个类叫BeautifulSoup
soup = BeautifulSoup(demo,'html.parser') #把demo的页面熬成一个beautifulsoup能够理解的汤
print(soup.prettify()) #还要给出解析demo的解释器

BeautifulSoup库的基本元素

无论哪种解析器,它都是可以有效解析xml和html文档的

包含a标签的上一层标签

基于bs4库的html内容遍历方法

#标签树的上行遍历
import requests
r = requests.get('http://python123.io/ws/demo.html')
r.text
demo = r.text
from bs4 import BeautifulSoup
soup = BeautifulSoup(demo, 'html.parser')
for parent in soup.a.parents:
    if parent is None:
        print(parent)
    else:
        print(parent.name)

所有平行遍历必须是在同一个父亲节点下

基于bs4的HTML格式输出

bs4库的prettiffy()方法——给所有标签后面都添加换行符

bs4库将任何读入的html文件或字符串都转换成了UTF-8编码(python3 默认支持编码也是UTF-8)

信息标记的三种形式—XML、JSON、YAML

信息标记的三种形式—XML、JSON、YAML_hxxjxw的博客-CSDN博客

信息提取的一般方法

实例

import requests
r = requests.get('http://python123.io/ws/demo.html')
demo = r.text
from bs4 import BeautifulSoup
soup = BeautifulSoup(demo, 'html.parser')
for link in soup.find_all('a'):
	print(link.get('href'))

基于bs4库的HTML内容查找方法

由于find_all函数非常常用,在buautifulsoup库中还有一种简写形式

实例:中国大学排名爬虫

request-bs4是无法获取由js等脚本语言动态生成的信息的,只能提取的信息是写在html页面的代码中才行

输出的format

import requests
from bs4 import BeautifulSoup
import bs4

def getHTMLText(url):  # 输入需要获取的url的信息,输出是url的内容
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

# 整个程序的核心部分
# 从html文件中首先找到tbody标签,获取所有大学的相关信息
# 然后在tbody标签中解析tr标签,获得每一个大学的信息
# 再把tr标签中的td标签找到,把每个大学的相关的数据参数写道对应的ulist列表中
def fillUnivList(ulist, html):  # 将html页面放入ulist列表中
    soup = BeautifulSoup(html, 'html.parser')
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):  # 它的儿子中可能会出现字符串类型,而所有大学信息都是封装在标签中是标签类型,所以过滤一下
            tds = tr('td')  # 对tr标签中的td做查询
            ulist.append([tds[0].string, tds[1].string, tds[3].string])


def printUnivList(ulist, num):  # 将列表中的元素打印出来
    print('{:^10}\t{:^6}\t{:^10}'.format('排名', '学校名称', '总分'))
    for i in range(num):
        u = ulist[i]
        print('{:^10}\t{:^6}\t{:^10}'.format(u[0], u[1], u[2]))


def main():  # 主函数
    uinfo = []
    url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html'
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)


main()

解决中文对齐问题

当中文字符宽度不够时,系统默认采用西文字符填充导致不对齐

import requests
from bs4 import BeautifulSoup
import bs4


def getHTMLText(url):  # 输入需要获取的url的信息,输出是url的内容
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

# 整个程序的核心部分
# 从html文件中首先找到tbody标签,获取所有大学的相关信息
# 然后在tbody标签中解析tr标签,获得每一个大学的信息
# 再把tr标签中的td标签找到,把每个大学的相关的数据参数写道对应的ulist列表中


def fillUnivList(ulist, html):  # 将html页面放入ulist列表中
    soup = BeautifulSoup(html, 'html.parser')
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):  # 它的儿子中可能会出现字符串类型,而所有大学信息都是封装在标签中是标签类型,所以过滤一下
            tds = tr('td')  # 对tr标签中的td做查询
            ulist.append([tds[0].string, tds[1].string, tds[3].string])


def printUnivList(ulist, num):  # 将列表中的元素打印出来
    tplt = '{0:^10}\t{1:{3}^10}\t{2:^10}'
    print(tplt.format('排名', '学校名称', '总分', chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2], chr(12288)))


def main():  # 主函数
    uinfo = []
    url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html'
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)


main()

相关文章:

  • 查看win10系统日志
  • Windows安全模板配置
  • Python网络爬虫与信息提取(四):网络爬虫之实战(淘宝商品比价 股票数据)
  • Python—Scrapy爬虫框架
  • 大数据技术原理与应用(一):大数据概述
  • 大数据技术原理与应用(二):大数据处理架构Hadoop
  • 大数据技术原理与应用(三):分布式文件系统HDFS
  • Ubuntu18.04安装 Codeblocks
  • Win10将某个软件/文件添加到开始屏幕(磁贴)
  • phpStudy(LAMP)
  • Win10创建新用户账户
  • Win10家庭版增加本地安全策略(组策略)
  • 后台登录密码绕过+sql注入+一句话木马 实验演示(盾灵)
  • 网络攻防实验之Web服务蜜罐部署实验
  • 网络攻防实验之木马攻击实验
  • 【剑指offer】让抽象问题具体化
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Android框架之Volley
  • co.js - 让异步代码同步化
  • ES6系列(二)变量的解构赋值
  • es的写入过程
  • Hibernate最全面试题
  • HTTP--网络协议分层,http历史(二)
  • in typeof instanceof ===这些运算符有什么作用
  • Java 内存分配及垃圾回收机制初探
  • jdbc就是这么简单
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • SpingCloudBus整合RabbitMQ
  • vue中实现单选
  • Web标准制定过程
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 记一次用 NodeJs 实现模拟登录的思路
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 昨天1024程序员节,我故意写了个死循环~
  • "无招胜有招"nbsp;史上最全的互…
  • #include<初见C语言之指针(5)>
  • $.proxy和$.extend
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (Python第六天)文件处理
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (转)树状数组
  • (转载)PyTorch代码规范最佳实践和样式指南
  • *1 计算机基础和操作系统基础及几大协议
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Core引入性能分析引导优化
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .Net的C#语言取月份数值对应的MonthName值
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @软考考生,这份软考高分攻略你须知道
  • [ C++ ] STL---仿函数与priority_queue
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [20171102]视图v$session中process字段含义
  • [ABC294Ex] K-Coloring
  • [AIGC] Spring Interceptor 拦截器详解