Python爬虫之解析网页

常用的类库为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

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

lxmlBeautifulSoupre
语法难易度简单简单复杂
查找速度较快

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯企业邮箱报错 smtp.exmail.qq.comport 465, isSSL false

一、报错 "smtp.exmail.qq.com" port 465, isSSL false 通过网上搜索查询一些资料&#xff0c;推测是邮箱的配置出问题了。 二、修改邮箱配置 1 // 创建属性2 Properties props new Properties();3 props.setProperty("mail.transport.protocol", "s…

spring与JDK版本对应关系

搭建spring框架得时候要考虑jdk的版本&#xff0c;提供一下参考 JDK 8 中可以使用 Spring Framework 5.x JDK 7 中可以使用 Spring Framework 4.x JDK 6 中可以使用 Spring Framework 4.x JDK 5 中可以使用 Spring Framework 3.x

Markdown预览功能不可用解决方案

初学者在使用Markdown时也许会遇到这个问题 原因是电脑缺少一个组件&#xff0c;解决方案很简单&#xff0c;安装上就好了&#xff0c;以下是链接 http://markdownpad.com/download/awesomium_v1.6.6_sdk_win.exe转载于:https://www.cnblogs.com/j9oker/p/10092829.html

Linux 中yum的配置

1.进入yum的路径 cd /etc/yum.repos.d 2.将原始的repo文件移入一个新建的backup文件下做备份 mv CentOS* backup 3.在/etc/yum.repos.d下新建一个自己的文件(这里的文件必须以repo结尾); vi zhi.repo 其中&#xff0c;第一行必须是[文件名]的格式  是一个标记 name*** 这是一…

[生态建设] - js判断小技巧

0、参考 说明: 从几个易得的点出发,逐步向外扩展延申,保证代码的可靠性 1、判断是否为某个类型 // 判断是否为 null const isNull o > {return o null; };// 判断是否为 undefined const isUndefined o > {return o undefined; };// 判断是否为 null or undefined…

Spring中Bean的概念

一、Bean的定义 <beans…/>元素是Spring配置文件的根元素&#xff0c;<beans…/>元素可以包含多个<bean…/>子元素&#xff0c;每个<bean…/>元素可以定义一个Bean实例&#xff0c;每一个Bean对应Spring容器里的一个Java实例定义Bean时通常需要指定两…

[TJOI2010]阅读理解

题目描述 英语老师留了N篇阅读理解作业&#xff0c;但是每篇英文短文都有很多生词需要查字典&#xff0c;为了节约时间&#xff0c;现在要做个统计&#xff0c;算一算某些生词都在哪几篇短文中出现过。 输入输出格式 输入格式&#xff1a; 第一行为整数N&#xff0c;表示短文篇…

ccentos 7下安装php5.6并使用nginx + php-fpm部署多个不同端口网站

作为一个的勤杂工&#xff0c;近期因公司内部信息化的需求&#xff0c;给新进员工提供基础的知识培训和介绍&#xff0c;也为了给公司内部建立一个沟通交流的平台&#xff0c;百度找了开源的百科系统HDwiki和开源的问答系统Tipask问答系统&#xff0c;蛋痛的这两套系统均是phpm…

Zookeeper基础使用机制原理

Znode&#xff1a; 1、Znode既是路径(目录)也是信息(文件) 2、Znode有两种分类&#xff1a;一分为临时节点(会话生命周期)和永久节点&#xff1b;二分为普通节点和顺序节点 Watch&#xff1a; 1、监听与通知机制&#xff0c;可以在节点上监听其本身(增、删、改)或其子节点(增、…

JS ajax请求参数格式( formData 、serialize)

1 $("#importBtn").click(function(){2 if($("#conId").val() ""){3 alert("请填写Id");4 return;5 }6 if($("#fromWhere").val() "…

【小工具分享】 - vscode注释自动生成

参考 关闭文件头部注释 点击设置 输入fileheader搜索 关闭头部注释 "fileheader.customMade" : {"autoAdd": false }

Spring的bean实例化过程

以XmlBeanFactory为例&#xff0c;最简单的取bean方式是&#xff1a; BeanFactory factory new XmlBeanFactory(new FileSystemResource("D:\\workspace\\JavaApplication2\\src\\javaapplication2\\spring\\beans.xml")); Car obj (Car)factory.getBean("c…

最全整理浏览器兼容性问题与解决方案(转)

所谓的浏览器兼容性问题&#xff0c;是指因为不同的浏览器对同一段代码有不同的解析&#xff0c;造成页面显示效果不统一的情况。在大多数情况下&#xff0c;我们的需求是&#xff0c;无论用户用什么浏览器来查看我们的网站或者登陆我们的系统&#xff0c;都应该是统一的显示效…

【算法】 - 滑动窗口

1. 题目链接 2. 分析 最多可以将K个值从0变成1,因此滑动窗口的限制条件: 0的数量(zeros)小于K,算法过程如下 有一个滑动窗口(slipper),每次都会从A中读入一个数当读入的数为0时,zeros当zeros的数量大于K时,会取出slipper首部的元素,当取值为0时zeros-- 总体代码如下: var lo…

Springboot整合thymeleaf模板

Thymeleaf是个XML/XHTML/HTML5模板引擎&#xff0c;可以用于Web与非Web应用。 Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式&#xff0c;因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板。相对于编写逻辑或代码&#xff0…

Java代码输出到txt文件(申请专利贴源码的必备利器)

最近公司在申请专利&#xff0c;编写不少文档&#xff0c;项目的代码量实在是过于庞大。如果一个一个的复制粘贴虽然能够完成&#xff0c;但是对于程序员而言实在没有这个必要。shell或者python就能解决这个问题。由于我个人对于shell和python不是非常熟练的情况下&#xff0c;…

【算法】 - 动态规划 + 位运算

题目描述 思路1: 写一个返回2进制中1数量的函数countOne遍历0到num,对每一个数使用countOne,并将结果保存到res中返回 var countBits function (num) {let res new Array(num 1).fill(0);for (let i 0; i < num; i) {res[i] countOne(i.toString(2));}return res; };…

Spring配置AOP切入点execution详解

例&#xff1a; execution (* com.sample.service…*. *(…)) 整个表达式可以分为五个部分&#xff1a; 1、execution():&#xff1a;表达式主体。 2、第一个*号&#xff1a;表示返回类型&#xff0c; *号表示所有的类型。 3、包名&#xff1a;表示需要拦截的包名&#xff…

Netty

1BS/CS? 2断点续传需要activeX,需要独立客户端有状态,tomcat无状态,或者Netty有状态,可以断点续传 3Netty核心java nio性能比较高 4Jetty和Netty和dubbo区别? 5 转载于:https://www.cnblogs.com/xinglongbing521/p/10105351.html