常用的类库为lxml, BeautifulSoup, re(正则)

以获取豆瓣电影正在热映的电影名为例,url='https://movie.douban.com/cinema/nowplaying/beijing/'

网页分析

部分网页源码

<ul class="lists"><liid="3878007"class="list-item"data-title="海王"data-score="8.2"data-star="40"data-release="2018"data-duration="143分钟"data-region="美国 澳大利亚"data-director="温子仁"data-actors="杰森·莫玛 / 艾梅柏·希尔德 / 威廉·达福"data-category="nowplaying"data-enough="True"data-showed="True"data-votecount="105013"data-subject="3878007">

分析可知我们要的电影名称信息在li标签的data-title属性里

下面开始写代码

爬虫源码展示

import requests
from lxml import etree              # 导入库
from bs4 import BeautifulSoup
import reimport time# 定义爬虫类
class Spider():def __init__(self):self.url = 'https://movie.douban.com/cinema/nowplaying/beijing/'self.headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}r = requests.get(self.url,headers=self.headers)r.encoding = r.apparent_encodingself.html = r.textdef lxml_find(self):'''用lxml解析'''start = time.time()                     # 三种方式速度对比selector = etree.HTML(self.html)        # 转换为lxml解析的对象titles = selector.xpath('//li[@class="list-item"]/@data-title')    # 这里返回的是一个列表for each in titles:title = each.strip()        # 去掉字符左右的空格print(title)end = time.time()print('lxml耗时', end-start)def BeautifulSoup_find(self):'''用BeautifulSoup解析'''start = time.time()soup = BeautifulSoup(self.html, 'lxml')   # 转换为BeautifulSoup的解析对象()里第二个参数为解析方式titles = soup.find_all('li', class_='list-item')for each in titles:title = each['data-title']print(title)end = time.time()print('BeautifulSoup耗时', end-start)def re_find(self):'''用re解析'''start = time.time()titles = re.findall('data-title="(.+)"',self.html)for each in titles:print(each)end = time.time()print('re耗时', end-start)if __name__ == '__main__':spider = Spider()spider.lxml_find()spider.BeautifulSoup_find()spider.re_find()

输出结果

海王
无名之辈
无敌破坏王2:大闹互联网
狗十三
惊涛飓浪
毒液:致命守护者
憨豆特工3
神奇动物:格林德沃之罪
恐龙王
老爸102岁
生活万岁
进击的男孩
摘金奇缘
亡命救赎
一百年很长吗
云上日出
谁是坏孩子
照相师
缘·梦
网络谜踪
龙猫
印度合伙人
绿毛怪格林奇
最萌警探
春天的马拉松
lxml耗时 0.007623910903930664
海王
无名之辈
无敌破坏王2:大闹互联网
狗十三
惊涛飓浪
毒液:致命守护者
憨豆特工3
神奇动物:格林德沃之罪
恐龙王
老爸102岁
生活万岁
进击的男孩
摘金奇缘
亡命救赎
一百年很长吗
超时空大冒险
天渠
爱不可及
二十岁
你好,之华
冒牌搭档
铁甲战神
克隆人
恐怖快递
中国蓝盔
阿凡提之奇缘历险
名侦探柯南:零的执行人
为迈克尔·杰克逊铸造雕像
再见仍是朋友
心迷宫
淡蓝琥珀
阿拉姜色
两个俏公主
云上日出
谁是坏孩子
照相师
缘·梦
网络谜踪
龙猫
印度合伙人
绿毛怪格林奇
最萌警探
春天的马拉松
BeautifulSoup耗时 0.061043500900268555
海王
无名之辈
无敌破坏王2:大闹互联网
狗十三
惊涛飓浪
毒液:致命守护者
憨豆特工3
神奇动物:格林德沃之罪
恐龙王
老爸102岁
生活万岁
进击的男孩
摘金奇缘
亡命救赎
一百年很长吗
超时空大冒险
天渠
爱不可及
二十岁
你好,之华
冒牌搭档
铁甲战神
克隆人
恐怖快递
中国蓝盔
阿凡提之奇缘历险
名侦探柯南:零的执行人
为迈克尔·杰克逊铸造雕像
再见仍是朋友
心迷宫
淡蓝琥珀
阿拉姜色
两个俏公主
云上日出
谁是坏孩子
照相师
缘·梦
网络谜踪
龙猫
印度合伙人
绿毛怪格林奇
最萌警探
春天的马拉松
re耗时 0.0004856586456298828

代码说明

1. lxml

lxml是通过xpath来查找

使用前需使用调用ertee.HTML()方法('()'内填HTML代码)生成一个可查找的对象

常用xpath语法如下

// 两个斜杠为向下查找孙子标签

/ 一个斜杠为查找直接儿子标签

[] 方括号内填标签属性,如查找class属性为name的a标签,格式为a[@class="name"]

/text() 取出标签的内容,如查找网页中的 <a class="name">KAINHUCK</a> 中的KAINHUCK,格式为//a[@class="name"]/text()

/@attr 取出标签的属性,如查找网页中的 <a class="name">KAINHUCK</a> 中的class属性值name,格式为//a[@class="name"]/@class

2. BeautifulSoup

使用前需先将HTML转换为课查找对象,格式为

BeautifulSoup(html, 'lxml')

html 为HTML代码, 后面的参数为转换方法(其他方法有'html.parser' , 'html5lib', 推荐使用'lxml')

查找方法

info = find('a', id='kain') 查找第一个id属性为kain的a标签,并存进info变量中(其他标签同理)

find_all('a', class_='name') 查找所有class属性为name的a标签(注:class属性需写成'class_')

info.p.text 获取第一个id属性为kain的a标签下的p标签的内容(info为上面例子里的info,其他同理)

info.p['name'] 获取第一个id属性为kain的a标签下的p标签的name属性值(info为上面例子里的info,其他同理)

当代码中有很多同级标签时

<p class='info-list'><a class='name'>text1</a><a class='name'>text2</a><a class='name'>text3</a><a class='name'>text4</a></p>

示例代码如下

from bs4 import BeautifulSouphtml = '''<p class='info-list'><a class='name'>text1</a><a class='name'>text2</a><a class='name'>text3</a><a class='name'>text4</a></p>
'''
soup = BeautifulSoup(html, 'lxml')
texts = soup.find('p', class_='info-list')
print(texts.contents[1].text)    # 输出text1
print(texts.contents[2].text)    # 输出text2
print(texts.contents[3].text)    # 输出text3
print(texts.contents[4].text)    # 输出text4

注意:不是从0开始

3. re(正则表达式)

正则表达式内容较多,大家可以参考这里

总结

使用lxml查找时可以在目标网页按F12调出开发者窗口然后再在按Ctrl+f查找,在查找栏里输入你的xpath语法可以检查是否能找到对应内容

可以从看例子的输出中看出三种方法的速度

lxml耗时 0.007623910903930664

BeautifulSoup耗时 0.061043500900268555

re耗时 0.0004856586456298828

对以上三种最常用的解析网页的方法做个对比

lxml BeautifulSoup re
语法难易度 简单 简单 复杂
查找速度 较快

综上,对于网页内容的解析,这里推荐新手使用lxml方法,而对速度有要求就使用正则表达式(入门有点困难)

转载于:https://www.cnblogs.com/kainhuck/p/10090448.html

Python爬虫之解析网页相关推荐

  1. 如何用python抓取文献_浅谈Python爬虫技术的网页数据抓取与分析

    浅谈 Python 爬虫技术的网页数据抓取与分析 吴永聪 [期刊名称] <计算机时代> [年 ( 卷 ), 期] 2019(000)008 [摘要] 近年来 , 随着互联网的发展 , 如何 ...

  2. 32. Pandas借助Python爬虫读取HTML网页表格存储到Excel文件

    Pandas借助Python爬虫读取HTML网页表格存储到Excel文件 实现目标: 网易有道词典可以用于英语单词查询,可以将查询的单词加入到单词本; 当前没有导出全部单词列表的功能.为了复习方便,可 ...

  3. Python爬虫爬取网页数据并存储(一)

    Python爬虫爬取网页数据并存储(一) 环境搭建 爬虫基本原理 urllib库使用 requests库使用 正则表达式 一个示例 环境搭建 1.需要事先安装anaconda(或Python3.7)和 ...

  4. python通过xpath解析网页爬取高清大图和王者荣耀英雄海报

    python通过xpath解析网页 xpath XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言.最初是用来搜寻 XML 文档的,但 ...

  5. python爬虫爬取网页新闻标题-看完保证你会

    python爬虫爬取网页新闻标题方法 1.首先使用浏览自带的工具--检查,查找网页新闻标题对应的元素位置,这里查到的新闻标题是在 h3 标签中 2.然后使用编辑器编写python代码 2.1方法一: ...

  6. python爬虫正则表达式实例-python爬虫 正则表达式解析

    这篇文章主要介绍了python爬虫 正则表达式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 - re.I # 忽略大小写 - re.M # 多 ...

  7. python爬虫数据解析总结

    python爬虫数据解析总结 目录 python爬虫数据解析总结 1.概述 2.Xpath解析html数据 2.1.基本语法 1.查询语法 2.2.Xpath解析html数据 1.安装lxml库 2. ...

  8. python如何爬虫网页数据-python爬虫——爬取网页数据和解析数据

    1.网络爬虫的基本概念 网络爬虫(又称网络蜘蛛,机器人),就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序. 只要浏览器能够做的事情,原则上,爬虫都能够做到. ...

  9. python爬虫案例-python爬虫详细解析附案例

    什么是爬虫框架 说这个之前,得先说说什么是框架: 是实现业界标准的组件规范:比如众所周知的MVC开发规范 提供规范所要求之基础功能的软件产品:比如Django框架就是MVC的开发框架,但它还提供了其他 ...

最新文章

  1. andorid service 本地服务
  2. insert批量插入500ms_如何快速安全的插入千万条数据
  3. 从数据处理到人工智能的一批计算生态
  4. django2.0.6 连接使用redis集群
  5. 分分钟手写http server
  6. 【Tiny4412】 编译dnw源码报错 /lib/modules/2.6.32-431.el6.x86_64/build/: No such file or directory
  7. 迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等
  8. iOS绘圆形图-CGContextAddArc各参数说明
  9. JDK内置的进制转换
  10. javascript 字符串操作函数大全
  11. SQL Server 的存储过程[转]
  12. R语言︱机器学习模型评价指标+(转)模型出错的四大原因及如何纠错
  13. Java开发笔记(一百三十)Swing的选择框
  14. java 注解处理器的作用_JVM进阶 -- 浅谈注解处理器
  15. python相关性系数显著性检验_线性回归模型中系数趋势显著性的Statsmodels-Wald检验...
  16. Pthread线程基础学习
  17. 数美科技:全栈防御体系怎么样护航游戏ROI增长
  18. 基于MATLAB的分子相互作用的表征模型
  19. 干货来袭!腾讯T4大佬,十分钟教你用svg做出精美的动画
  20. linux系统制作qcow2,制作centos的qcow2格式镜像

热门文章

  1. SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tbl_contact' in 'where clause'.
  2. python3(十三)File对象的属性
  3. 测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2
  4. ORCAD CAPTURE 元件库详解
  5. [转] Windows CE 6.0 启动过程分析
  6. 云原生的本质_云原生是什么 云原生技术有何作用
  7. python3软件怎么用_Python3学习之路~4.4 软件目录结构规范
  8. import java.io 包下载_Go 包管理机制深入分析
  9. vb.net限制软件使用次数_新增投屏及倍数播放,这款软件iOSAndroid全都有,影视神器,抓紧体验...
  10. 未声明spire。它可能因保护级别而不可访问_信息系统安全:访问控制技术概述...