ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

解析库的使用-xpath-beautifulsoup-pyquery

2021-03-16 09:34:51  阅读:244  来源: 互联网

标签:xpath 返回 pyquery Soup beautifulsoup item html 节点 属性


xpath(lxml 库)

初始化etree对象

From lxml import etree

 

text = ''' 

<div> 

<ul> 

<li class="item-0"><a href=”link1. html”>first item</a><li> 

<li class=” item-1”>< a href=”link2.html”> second item</a><li> 

<li class=” item-inactive” >< a href="link3.html”>third item</ a></h> 

<li class=” item-1 item-0”><a href="link4.html'’>fourth item</a><li> 

<li class =” item -0” id=“a”><a href=”link5.html”>fifth item</a> 

</ul> 

</div>

‘’’

//加载字符串数据或者响应到的数据

Html = etree.HTML(text) 

 

//可以看到该字符串最后一个li标签没有闭合,采用toString()方法修复该标签

Html = Etree.toString(html).     结果是bytes类型

 

//加载本地文件中的数据进行解析

Html = etree.parse(filepath,etree.HTMLParser())

 

 

//获取上述text所有节点

etree.xpath(“//*”)

 

//获取第一个li节点

Etree.xpath(“/div/ul/li[1]”)

 

 

//获取第一个li标签内a标签的文本数据

Etree.xpath(//li[1][@class=“item-0”]/a[@href = “link1.html]/text())

 

 

//获取li标签内的子孙标签内的文本数据

Html.xpath(//li[@class=“item-0]//text())

 

 

//获取父节点和属性

Html.xpath(//a[@href=“link2.html”]/../@class)

 

//有时某个节点的属性有多个

Html.xpath(//li[contains(@class,”item1”)]/a/text())

 

 

//多属性匹配

Html.xpath(//li[@class=“item-0” and  @id=“a”]/a/@href)

 

 

//节点轴选择

ancester::选择器——-获取当前选中标签的所有父标签

child::选择器———获取所有选中节点的直接子节点

Attribute::选择器——-获取所有选中节点的属性

 

 

 

 

Beautiful Soup

 

beautiful soup 会自动将输入的文档转为unicode 编码格式,自动将输出的文档转为utf8的格式,无需考虑编码的问题,除非文档自身没有指定编码,指定一个编码格式就ok

(lxml解析器可以解析HTML,xml,解析的速度快,容错能力强)

 

 

//导入BeautifulSoup,lxml

from bs4 import BeautifulSoup

Import lxml

 

 

 

//文本数据

html = “”“

<html> <head>< title>The Dormouse ’s story</title></head> 

<body> 

<p class=”title" name="dromouse”>< b>The Dormouse ’s story</b></p> 

<p class=”story’'>Once upon a time there were three little sisters; and their names were 

<a href=” http://example.com/elsie” class= " sister” id=”linkl”>< ! - Elsie … >< la>, 

<a href=” http://example.com/lacie ” class=”sister” id=”link2”> Lacie</a> and 

<a href="http://example.com/tillie" class=”sister” id=”link3 ”>Tillie</a> ; 

and they lived at the bottom of a well .</p> 

<p class=”story”> ... <Ip> 

“”“

 

//初始化

From bs4 import BeautifulSoup

//此步骤会将html中不标准的标签,进行标准化输出

Soup = BeautifulSoup(html,’lxml)

 

//将文档以标准缩紧的格式输出

print(soup.prettify())

 

 

//节点选择,直接soup对象+节点名称(标签名称)就可以获取该节点,获取该节点的文本数据用string属性

 

//获取title节点

Soup.title

 

//获取title节点内的文本数据string属性或者get_text()方法,两者功能完全一致

Soup.title.string

 

//获取p标签—-此时返回的是文档中第一个p标签内容(只会返回第一个选中的节点)

Soup.p

 

 

//调用name属性返回节点的名称(标签名称)

Soup.title.name

 

//提取选中节点的属性,attrs不携带属性返回选中节点的所有属性值,携带参数返回特定属性值

Soup.p.attrs.   //返回的是一个字典,如果一个属性有多个值,那么该键所对应的值是一个列表

Soup.p.attrs[“title”]

 

 

//嵌套选择—每个返回结果都是bs4.element.tag类型

//选择head标签内的title标签

Soup.head.title

 

//contents属性与children属性,descendants

 

//content与children属性一致,返回选中节点内的所有直接子节点,contents返回的是列表,children返回的是生成器

Soup.body.contents soup.body.children

 

//descendants将返回选中节点的子孙节点,返回一个生成器

 

//获取父节点

Soup.p.parent. ——直接父节点

soup.p.parents——返回所有的父节点和祖先节点。返回结果是一个生成器

 

//获取兄弟节点

Soup.p.next_sibling —- soup.p.previous_sibling 返回的p节点的下一个和上一个兄弟节点

Soup.p.next_siblings ——soup.p.previous_siblings 返回的是所有的下兄弟节点和上兄弟节点

 

 

//方法选择器

find_all(name,attrs,recursive,text,**kwargs) 返回需有符合条件的节点,返回结果是一个列表形式

 

//选择节点名称name

soup.find_all(“p”)

 

//选择属性,参数类型是字典形式

Soup.find_All(attrs={“id”:”aa”})

 

//text属性可以传入字符串或者正则表达式-返回节点中的文本符合该条件的文本列表

 

Soup.find_all(text=re.compile(“text”))

 

//find()方法与find_all接口一致,只不过find返回第一个匹配成功的节点,后者返回所有匹配的列表

 

 

//css选择器

//select()方法返回所有符合css选择器的节点列表—-也可以进行嵌套选择

Soup.select(“#id .class tag”)

 

//获取属性

Soup.ul[“id”]  ———-soup.ul.attrs[“id”]

 

 

 

pyquery

 

From pyquery import PyQuery as pq

 

初始化:

Doc = PyQuery(参数):这里的参数可以是字符串,文件名(需要指定参数为filename),url(这里的url代表请求网页的url,原理:先对该url发起请求,将获得响应对象的数据作为字符串参数参与初始化

 

例如:PyQuery(url) 相当于 PyQuery(requests.get(url).text)

 

 

 

选择器的使用:

例如:doc(’#contain .abs p’) 代表选择id为contain下class为abs下的p标签。

 

 

 

查找子节点时需要用到find方法,传入的参数时css选择器(范围时子孙节点)

例如 :ul = doc(‘.ul’)

li  = ul.find(“li”)

代表先选中calss为ul的标签,在获取其下的li标签

 

 

查找子节点的时候可以使用children方法(范围是子节点)

 

例如:item.children() 返回item的所有子节点,

Item.children(“#a”) 返回item中id为a的子节点

 

 

 

查找父节点方法parent (只会返回直接点父节点,不会返回祖先节点)

例如:parent = item.parent() 返回item的父节点

 

 

查找祖先节点parents

例如:item.parents() 返回父节点和所有的祖先节点

item.parents(“#a”) 返回id为a的祖先节点

 

查找兄弟节点siblings方法

例如:item.siblings()返回item 的所有兄弟节点

item.siblings(“#a”) 返回item兄弟节点中id为a 的兄弟节点

遍历:在调用相关方法后可能得到一个节点或多个节点,一个节点可以对其直接打印或转为字符串,但多个节点需要用items()方法将其转为生成器进行遍历

 

 

获取节点的属性attr()方法

例如 item.attr(“href) 或者 item.attr.href 效果相同,当item是一个节点时,必然返回相应的属性值,但是如果item为多个节点,则只会返回第一个节点的属性,如果想要返回所有节点的属性,可以采用上述的遍历的方法

 

 

获取节点的文本值和html文本

例如 item.text(), item.html() ,前者回返回当前节点的所有文本数据,在item为多个节点时同样返回每个节点的文本数据,每个节点之间的文本数据用空格分开,但html方法,在节点有一个的时候返回的是当前节点内的html文本,但在多个节点时只会返回第一个节点内的html文本,所以在有多个节点时需要用到遍历的方法

 

 

修改节点的属性

例如:addClass 为当前节点添加一个class,removeClass 为当前节点移除class

Attr()方法传入一个参数时获取该属性,传入两个参数时添加属性,text()携带参数代表添加文本数据到当前节点,html()携带参数代表添加html文本到当前节点。

remove()方法移除选中的节点,

 

标签:xpath,返回,pyquery,Soup,beautifulsoup,item,html,节点,属性
来源: https://www.cnblogs.com/laoyu-love-life/p/14541603.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有