解析库的使用(XPath,BeautifulSoup, pyquery)

1 篇文章 0 订阅
1 篇文章 0 订阅

从崔庆才的《Python3网络开发实战》上总结而来

使用XPath

from lxml import etree

html = etree.HTML(text)    #调用HTML类进行初始化

html = etree.parse(text, etree,HTML.Parser())#直接对文本进行解析,但是会多出一个DOCTYPE声明

result = etree.tostring(html)    #输出修正后的HTML文本,是bytes类型

result.decode(‘utf-8’)    #将bytes类型转换成str类型

result = html.xpath(匹配模式)

html.xpath(‘title’) 表示选取title元素的所有子节点

html.xpath(‘/title’) 表示选取根元素 title

html.xpath(‘title /book’) 选取属于title的子元素的所有 book 元素。

html.xpath(‘//book’) 选取所有 book 子元素,而不管它们在文档中的位置。

html.xpath(‘title //book’) 选择属于title 元素的后代的所有 book 元素,而不管它们位于title之下的什么位置。

html.xpath(‘//@lang’) 选取名为 lang 的所有属性

多层[表达式]之间用|分隔

表达式                                     描述

nodename                           选取此节点的所有子节点

/                              从根节点选取

   //             从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置

   .                               选取当前节点

   ..                              选取当前节点的父节点

   @                               选取属性

属性匹配可以采用and  or 等运算符

路径表达式                                结果

/bookstore/book[1]      选取属于 bookstore 子元素的第一个 book 元素

/bookstore/book[last()]                 选取属于 bookstore 子元素的最后一个 book 元素。

/bookstore/book[last()-1]               选取属于 bookstore 子元素的倒数第二个 book 元素。

/bookstore/book[position()<3]           选取最前面的两个属于 bookstore 元素的子元素的 book 元素。

//title[@lang]    选取所有拥有名为 lang 的属性的 title 元素。

//title[@lang=’eng’]                 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。

/bookstore/book[price>35.00]           选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。

/bookstore/book[price>35.00]/title     选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

 

通配符                                   描述

*                                    匹配任何元素节点

@*                                   匹配任何属性节点

node()                               匹配任何类型的节点

轴可定义相对于当前节点的节点集。格式 轴名称::

轴名称                                               结果

ancestor                    选取当前节点的所有先辈(父、祖父等)。

ancestor-or-self  选取当前节点的所有先辈(父、祖父等)以及当前节点本身。

attribute                      选取当前节点的所有属性。

child                         选取当前节点的所有子元素。

descendant                   选取当前节点的所有后代元素(子、孙等)。

descendant-or-self   选取当前节点的所有后代元素(子、孙等)以及当前节点本身。

following            选取文档中当前节点的结束标签之后的所有节点。

namespace            选取当前节点的所有命名空间节点。

parent               选取当前节点的父节点。

preceding            选取文档中当前节点的开始标签之前的所有节点。

preceding-sibling    选取当前节点之前的所有同级节点。

self                 选取当前节点。

方法:

text()获取节点中的文本

contains(),第一个参数传入属性名称,第二个参数传入属性的值,只要此属性包含所传入的属性值,就可以完成匹配。

 

BeautifulSoup

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 解析器)#解析器常用lxml

soup.prettify()#以标准的缩进形式输出

soup.节点  #输出匹配到的第一个节点

soup.节点.string   #获取节点的文本

soup.节点.name     #获取节点的名称

soup.节点.attrs    #获取节点的所有属性,以字典形式返回{属性名:属性值}

soup.节点.contents     #获得直接子节点的列表

soup.节点.children     #返回子节点的生成器

soup.节点.descendants  #返回递归所有子节点的生成器

soup.节点.parent       #父节点及其内部的全部内容

soup.节点.parents      #所有祖先节点及其内容,以生成器形式返回

soup.节点.next_sibling      #节点的下一个兄弟节点内容

soup.节点.previous_sibling  #节点的上一个兄弟节点内容

soup.节点.next_siblings   #节点的后面所有兄弟节点内容,以生成器形式返回

soup.节点.previous_siblings#节点的前面所有兄弟节点内容,以生成器形式返回

方法:返回列表形式

find_all(name, attrs, recursive, text, **kwargs)

name参数其值为节点名,attrs为字典参数(当属性名为class时,可用class_作为属性名),text参数用来匹配节点的文本,传入的形式可以使字符串或正则表达式对象。

find()返回的是第一个匹配的节点内容

find_parent()返回直接父节点

find_parents()返回所有祖先节点

find_next_sibling()返回后面第一个兄弟节点

find_next_siblings()返回后面的所有兄弟节点

find_previous_sibling()返回前面第一个兄弟节点 

find_previous_siblings()返回前面的所有兄弟节点 

find_next()返回节点后第一个符合条件的节点

find_all_next()返回节点后所有符合条件的节点

find_previous()返回节点前第一个符合条件的节点 

find_all_previous()返回节点前所有符合条件的节点

 

pyquery

from pyquery import PyQuery as pq

需要初始化PyQuery对象,比如直接传入字符串、URL、文件名

doc = pq(html)

doc = pq(url=url)指定url参数

doc = pq(filename=filename)指定filename参数

result= =doc(#container.list li)#选取id为container的节点,再选取内部的class为list的节点内部的所有li节点

方法:返回类型为PyQuery类型

result.find(CSS选择器)#返回所有子孙节点中符合CSS选择器的节点

result.children(CSS选择器)# 返回直接子节点中符合CSS选择器的节点

result.parent(CSS选择器)# 返回直接父节点中符合CSS选择器的节点

result.parents(CSS选择器)# 返回所有祖先节点中符合CSS选择器的节点

result.siblings(CSS选择器)#返回所有兄弟节点中符合CSS选择器的节点

对PyQuery类型调用items()方法后,会得到一个生成器,

result.attr(),传入属性名称就可以得到属性值,如果传入第二个参数则可以修改属性值。

result.text(),如果不传参数,则获取节点内纯文本,如果传入参数则进行赋值。

result.html(),如果不传参数,则获取节点内HTML文本,如果传入参数则进行赋值。

result.removeClass(属性名),将节点内的属性移除。

result.addClass(属性名),添加属性到节点。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值