beautiful soup爬虫初识

Beautiful Soup的安装,简称bs4

pip3 install bs4

bs4解析器选择

解析器

使用方法

优势

劣势

Python标准库

BeautifulSoup(markup, "html.parser")

Python的内置标准库执行速度适中文档容错能力强

Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差

lxml HTML 解析器

BeautifulSoup(markup, "lxml")

速度快文档容错能力强

需要安装C语言库

lxml XML 解析器

BeautifulSoup(markup, ["lxml-xml"])BeautifulSoup(markup, "xml")

速度快唯一支持XML的解析器

需要安装C语言库

html5lib

BeautifulSoup(markup, "html5lib")

最好的容错性以浏览器的方式解析文档生成HTML5格式的文档

速度慢不依赖外部扩展

官方推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定

lxml解析器安装

pip3 install lxml

使用bs4过滤器

自建示例文件scenery.html文件的内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>武汉旅游景点</title>
    <meta name="description" content="武汉旅游景点 精简版" />
    <meta name="author" content="hstking">
</head>
<body>
    <div id="content">
        <div class="title">
            <h3>武汉景点</h3>
        </div>
        <ul class="table">
            <li>景点<a>门票价格</a></li>
        </ul>
        <ul class="content">
            <li nu="1">东湖 <a class="price">60</a></li>
            <li nu="2">磨山 <a class="price">60</a></li>
            <li nu="3">欢乐谷 <a class="price">108</a></li>
            <li nu="4">武昌极地海洋世界 <a class="price">150</a></li>
            <li nu="5">玛雅水上乐园 <a class="price">150</a></li>
        </ul>
    </div>

</body>
</html>

使用lxml解析器,打印scenery.html内容

from bs4 import BeautifulSoup

# 使用lxml解析器
soup = BeautifulSoup(open('scenery.html', encoding='utf8'), 'lxml')
# prettify按标准的缩进格式的结构输出
print(soup.prettify())

执行结果:  按照标准的缩进格式的结构输出

bs4解析器lxml练习:

#!/usr/bin/env python
# coding: utf-8
from bs4 import BeautifulSoup

# 使用lxml解析器
soup = BeautifulSoup(open('scenery.html', encoding='utf8'), 'lxml')
# prettify按标准的缩进格式的结构输出
print(soup.prettify())

# 获取第一次出现的标签名为ul的标签内容
print(soup.ul)
print('\n')

# 使用bs4过滤器soup.find()的方法获取第一次出现的标签内容
print(soup.find('ul'))
print('\n')

# 使用soup.find_all方法获取所有符合条件的标签列表,然后从列表中读取就行了
print(soup.find_all('ul'))  # 获取所有ul中所有内容
print('\n')

print(soup.find_all('ul')[0])  # 获取第一个ul中的所有内容
print('\n')

print(soup.find_all('ul')[1])  # 获取第二个ul中的所有内容
print('\n')

# 可以用soup.find(TagName, attrs={attrName:attrValue})的方法获取Tag的位置
# 获取li标签nu='3'的内容,适用标签名相同,属性不同的标签
print(soup.find('li', attrs={'nu': '3'}))
print('\n')

# 标签名相同,属性相同,连属性值都相同的标签
# 可以用soup.find_all(TagName,attr={'attName':'attValue'})将符合条件的内容全部放到列表里面
# 找a标签,class='price'的第一个内容
print(soup.find_all('a', attrs={'class': 'price'})[0])
print('\n')

# 获取li标签,nu='2'的内容
Tags = soup.find('li', attrs={'nu': '2'})
print(Tags)
print(Tags.a)  # 获取nu='2'里面的a标签内容
print(Tags.find('a'))  # 获取nu='2'里面的a标签内容
print('\n')

# 获取li标签,nu='4'的内容
Tag = soup.find('li', attrs={'nu': '4'})
print(Tag)

# 获取li标签,nu='4'中nu的值
print(Tag.get('nu'))

# 获取li标签,nu='4'中的文本内容
ss = Tag.get_text()
print(ss)

# 以空格切割上面文本内容拿到第一个值
print(Tag.get_text().split(' ')[0])

# 获取li标签下a标签的文本内容
print(Tag.a.get_text())

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏对角另一面

读Zepto源码之Data模块

Zepto 的 Data 模块用来获取 DOM 节点中的 data-* 属性的数据,和储存跟 DOM 相关的数据。 读 Zepto 源码系列文章已经放到了git...

2150
来自专栏梧雨北辰的开发录

iOS面试知识总结之问题解决

凡经历过iOS面试的我们总会发觉,即使实际开发中做过许多项目,也难免为一个普通的面试题受挫。这也许不是因为我们技术不过关,而是因为在平时我们忽略了怎样将用到的知...

3124
来自专栏GopherCoder

『Go 内置库第一季:error』

Go 中的错误处理和别的语言不一样,设计哲学也不一样,常有开发者埋怨 Go 语言中的错误处理。

1143
来自专栏崔庆才的专栏

Selenium的使用方法简介

Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。对于一...

6126
来自专栏Python

linux每日命令(13):more命令

more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(s...

941
来自专栏林德熙的博客

WPF 触摸到事件

在 WPF 界面框架核心就是交互和渲染,触摸是交互的一部分。在 WPF 是需要使用多个线程来做触摸和渲染,触摸是单独一个线程,这个线程就是只获得触摸,而将触摸转...

2732
来自专栏知无涯

ASP跨站提交参数检测

36216
来自专栏Python小屋

Python爬虫扩展库scrapy选择器用法入门(一)

关于BeutifulSoup4的用法入门请参考Python爬虫扩展库BeautifulSoup4用法精要,scrapy爬虫案例请参考Python使用Scrapy...

3365
来自专栏前端小作坊

原型链上的DOM Attributes

Chrome开发小组最近发表声明他们正在將DOM properties移动到原型链中。这个更新将会在Chrome 43(2015年4月发布beta版本)中实现。...

1083
来自专栏ccylovehs

JavaScript异步编程

平时开发经常会用到js异步编程,由于前端展示页面都是基于网络机顶盒(IPTV的一般性能不太好,OTT较好),目前公司主要采取的异步编程的方式有setTimeou...

1352

扫码关注云+社区

领取腾讯云代金券