从崔庆才的《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(属性名),添加属性到节点。