(最全)Xpath、Beautiful Soup、Pyquery三种解析库解析html 功能概括
一、Xpath 解析
代码有不明白的 欢迎来微信公众号“他她自由行”找我,回复任何话都可以 我都会回你哒~
xpath:是一种在XMl、html文档中查找信息的语言,利用了lxml库对HTML解析获取数据。
Xpath常用规则:
nodename :选取此节点的所有子节点
// :从当前节点选取子孙节点
/ :从当前节点选取子节点
. : 选取当前节点
.. : 选取当前节点父节点
@ : 选取属性
1.初始化html
etree.parse()是初始化html构造一个XPath解析对象;
etree.tostring()是修复html文件中代码,把缺的头或尾节点补齐;
result.deode('utf-8')修复后的HTML代码是字节类型,转化成字符串;
from lxml import etreed
html=etree.parse('c:/.../test.html',etree.HTMLParser())
result=etree.tostring(html)
result.decode('utf-8')
2.获取所有节点
Xpath规则一般用 // 开头
例:
html.xpath('//*') //获取所有的节点
html.xpath('//li') //获取所有li节点
3.子节点、子孙节点
html.xpath('//li/a') //所有li下是所有直接a子节点
html.xpath('//ul//a') //所有ul下的子孙a节点
4.父节点
html.xpath('//a[@href="links.html"]/../@class')
//找到所有a节点中href为links.html的父节点的class值
// .. 来实现查找父节点
5.属性匹配
html.xpath('//li[@class="item-0"]') //找到class值为item-0是节点
6.文本获取
html.xpath('//li[@class="item-0"]/a/text()')
或html.xpath('//li[@class="item-0"]//text()')
7.属性获取
html.xpath('//li/a/@href') //找到li下a中的href属性值
8.属性多值匹配
html.xpath('//li[contains(@class,"li")]/a/text()') //只要节点属性class中包含li就能匹配出来
9.多属性匹配
html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()') //匹配节点属性class值为li,name值为item的节点
二、Beautiful Soup 解析
Beautiful Soup是HTML或XML解析库。通过解析文档为用户提供需要抓取的的数据。
需要解析器:lxml HTML解析库、lxml XML解析库、Python标准库、html5lib
基本用法:
from bs4 import BeautifulSoup
soup=BeautifulSoup(html,'lxml')
1.soup.prettify()
调用prettify()方法把要解析的字符串以标准的缩进格式输出
2.节点选择器:
例:soup.title.string
(1)选择元素:
soup.title、soup.title.sring soup.head soup.p
(2)提取信息:
  1)获取节点名称:soup.title.name
  2) 获取属性:soup.p.attrs、soup.p.attrs['name']
  3) 获取内容:soup.p.string
(3)嵌套选择:
soup.head.title.string
(4)关联选择:
  enumerate() //生成器类型
(1)soup.p.contents //p节点下的直接子节点列表
(2)soup.p.descendants //p节点下的所有子孙节点(生成器类型)
(3)父节点和祖先节点:soup.p.partent、soup.p.parents
(4)兄弟节点:
soup.a.next_sibling
soup.a.previous_sibling
soup.a.next_siblings
enumerate(soup.a.pervious_siblings)
(5)提取信息:soup.a.next_sibling.string
3.方法选择器:
find_all(name,attrs,recursive,text,**kwargs)
(1)name:find_all(name='li')
(2)attrs:find_all(attrs={'id':'list-1'})、find_all(class_='element')
(3)text:匹配节点的文本,find_all(text='字符串或正则表达式')
特:find()用法与fand_all一样,只不过只匹配第一个元素
4.css选择器
调用select()方法,传入相应css选择器
soup.select('.panel.panel-heading')
soup.select('ul li') //所有ul下的所有li
soup.select('#list-2.element')
(1)嵌套选择:
for ul in soup.select('ul'):
ul.select('li')
(2)获取属性:
for ul in soup.select('ul')
ul.attrs['id']
ul['id']
(3)获取文本:
for li in soup.select('li'):
li.get_text()
lli.string
三、 pyquery 解析
1.初始化:
(1)字符串初始化:
html=''' *******
'''
from pyquery import PyQuery as pq
doc=pq(html)
print(doc('li'))
(2)URL初始化
doc=pq(url=" https:/ ... ")
(3)文件初始化
doc=pq(filename='demo.html')
print(doc(li))
2.基本css选择器
doc('#container .list li') //id 为container,class为list下的所有li
3.查找节点
(1)子孙节点、子节点
.find():查找所有子孙节点
items=doc('.list')
items.find('li')
.children():查找子节点
items=doc('.list')
items.children('.active')
(2)父节点
doc=pq(html)
items=doc('.list')
items.parent()
祖先节点
items.parents()
(3)兄弟节点
doc=pq(html)
li=doc('.lsit .item-0.active')
li.siblings('.active')
4.遍历
用items()函数生成列表生成器进行遍历
doc=pq(html)
lis=doc('li').items()
for li in lis:
print(li)
5.获取信息
(1)获取属性
a=doc('.item-0.active a')
print(a.attr('href'))或print(a.attr.href)
特:attr只会输出第一个a节点属性,要用items()遍历
(2)获取文本
.text()
a=doc('.item-0.active a')
a.text() //text()函数会输出所有的li文本内容
.html()
li=doc('li')
li.html() //html()只会输出第一个li节点内的HTML文本
6.节点操作
(1) removeClass addClass
li=doc('.item-0.active')
print(li)
li.removeClass('active') //移除active的class
li.addClass('active') //增加active的class
(2) attr text html
li.attr('name','link') //增加属性name=link
li.text('changed item') //改变文本 changed item
li.html(<span>changed item </span>) //改变HTML
(3) remove()
wrap=doc('.wrap')
wrap.find('p').remove() //删除wrap中p节点
wrap.text()
特:伪类选择器
选择第一个节点,最后一个节点,奇偶数节点,包含某一文本节点
代码有不明白的 欢迎来微信公众号“他她自由行”找我,回复任何话都可以 我都会回你哒~
(最全)Xpath、Beautiful Soup、Pyquery三种解析库解析html 功能概括的更多相关文章
- 【Python】使用Beautiful Soup等三种方式定制Jmeter测试脚本
背景介绍 我们在做性能调优时,时常需要根据实际压测的情况,调整线程组的参数,比如循环次数,线程数,所有线程启动的时间等. 如果是在一台Linux机器上,就免不了在本机打开图形页面修改,然后最后传递到压 ...
- xpath beautiful pyquery三种解析库
这两天看了一下python常用的三种解析库,写篇随笔,整理一下思路.太菜了,若有错误的地方,欢迎大家随时指正.......(conme on.......) 爬取网页数据一般会经过 获取信息-> ...
- ubuntu下的python网页解析库的安装——lxml, Beautiful Soup, pyquery, tesserocr
lxml 的安装(xpath) pip3 install lxml 可能会缺少以下依赖: sudo apt-get install -y python3-dev build-e ssential li ...
- 新的三种EBS类型解析
就在前两天,创建EBS的之后页面发生了点变化,出现三种新的类型: General Purpose (SSD) Volumes Provisioned IOPS (SSD) Volumes Magnet ...
- c++中new的三种用法详细解析
转载至: http://www.jb51.net/article/41524.htm 以下的是对c++中new的三种使用方法进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助. 一. ...
- android中MVC,MVP和MVVM三种模式详解析
我们都知道,Android本身就采用了MVC模式,model层数据源层我们就不说了,至于view层即通过xml来体现,而 controller层的角色一般是由activity来担当的.虽然我们项目用到 ...
- Java中Singleton的三种实现方式解析
一.什么是Singleton? <设计模式>的作者.Eclipse和 Junit 的开发者 Erich Gamma 在它的理论体系中将 Singleton 定义为仅仅被实例化一次的类.在当 ...
- Redis五种基础与三种高级数据结构解析
记得点赞+关注呦. 前言 在 Redis 最重要最基础就属 它丰富的数据结构了,Redis 之所以能脱颖而出很大原因是他数据结构丰富,可以支持多种场景.并且 Redis 的数据结构实现以及应用场景在面 ...
- python安装json的方法;以及三种json库的区别
python中的json解释库有好几个,不同版本使用方法不同. 常用有 json-py 与smiplejson 两个包 其中,json-py 包含json.py外,还有一个minjson,两者用法上有 ...
随机推荐
- Python 爬虫入门实例(爬取小米应用商店的top应用apk)
一,爬虫是什么? 爬虫就是获取网络上各种资源,数据的一种工具.具体的可以自行百度. 二,如何写简单爬虫 1,获取网页内容 可以通过 Python(3.x) 自带的 urllib,来实现网页内容的下载. ...
- .Net面试经验,从北京到杭州
首先简单说下,本人小本,目前大四软件工程专业,大三阴差阳错地选了.Net方向,也是从大三开始接触.Net.自认为在学生中.net基础还可以,嘿嘿,吹一下. 大四第一学期学校安排去北京培训,培训了两个月 ...
- 自己从0开始学习Unity的笔记 V (C#的数组练习)
今天练习了数组输入,先从最简单的开始,因为我输入完这些之后,觉得应该有更简单的方法,先来介绍一下我做的练习代码 //做一个最多能容纳10个数字的,用户可以输入任意1-10个数字,判断长度,输出数字 ] ...
- django系列3.4-- request对象和response对象(未完待续)
一.request对象 详细信息可以查阅django官方文档 共有五种请求相关的常用值 request.path_info 返回用户访问的url不包括域名 request.method 请求中使用的H ...
- IE8兼容性问题 val()
IE8有时使用val()不正常,需要使用attr('value') 另外还有一些其他问题: https://blog.csdn.net/chenyiminnanjing/article/details ...
- 引入阿里的druid
Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. Druid支持所有JDBC兼容的数据库,包括 ...
- 简单列举几种常用 FTP
简单说下几种FTP FTP:文件传输协议(File Transfer Protocol,FTP) SFTP:OPENSSH 提供的隧道级文件传送(file transfer) FTPS:支持传输层安全 ...
- 分享一些JAVA常用的学习网站
常用学习网站freecodecamp 一个非常好的网站,教学模式类似游戏中的闯关,通过每关之后会有成就感,在该网站还有设有聊天室,可以进行相关的技术交流,很棒的学习网站. https://www.fr ...
- 阿里巴巴前端面试分享-社招(p6)
借鉴了朋友的阿里面试经:(社招前端2年经验) 电话面 简单自我介绍, 做过哪些项目, 使用哪些技术栈 ? 如何看待前端框架选型 ? vue的如何实现双向绑定的 ? react 虚拟DOM 是什么? 如 ...
- Win10将用户名修改为英文
前言 最近重装了一次Win10系统,手贱地在引导里设置了中文的用户名.使用微软账户进行登录后,Win10以这个中文名建立了用户的文件夹,使得少数软件安装或使用过程中,保存路径不支持中文路径,从而报错, ...