基本使用
from lxml import etree
text = 'abc刘嘉强 '
html = etree.HTML(text)
#以字符串构造节点
print(etree.tostring(html).decode('utf-8'))
#将节点转换为字符串,设置编码
result = html.xpath('//li/text()')
#选择文本值,result是一个列表
print(result)
'//'子孙节点
html.xpath('//li/a') '/'直接子节点
html.xpath('//li/a/../a') '..'父节点
html.xpath('//li/a/parent::/a') 'parent::'父节点
html.xpath('//li/text()') text()获取节点内的文本,不会获取子节点的文本
html.xpath('//li/@class') @属性名 获取所有匹配节点的属性值
html.xpath('//a[@class="x"]') #@属性名=属性值 选择匹配节点
针对这种情况,用之前的的简单匹配无法成功,需要contains()函数
html.xpath('//a[contains(@class,"x")]')
针对需要多个属性确定一个节点,用and来连接 ,or也有
html.xpath('//a[@name="item" and contains(@class,"x")]/li')
html.xpath('//a/li[1]')#第一个节点
html.xpath('//a/li[last()]')#最后一个节点
html.xpath('//a/li[position() < 3]')#位置小于3的节点,也就是1,2
html.xpath('//a/li[last() - 2]')#倒数第三个节点
基本使用
from bs4 import BeautifulSoup
text = 'abc '
soup = BeautifulSoup(text,'lxml')
print(soup.prettify())
#以标准缩进格式输出
print(soup.li.string)
#获取li节点的文本
soup.a.ul.li
直接子节点: soup.a.contents 或者 soup.a.children
子孙节点: soup.a.descendants
直接父节点:soup.a.parent
祖先节点:soup.a.parents 包括父节点
下一个兄弟:soup.a.next_sibling
上一个兄弟:soup.a.previous_sibling
后面的兄弟:soup.a.next_siblings
前面的兄弟:soup.a.previous_siblings
soup.a.li.string 'string'获取文本
soup.a.name 'name'获取节点名称 为a
soup.a.attr['class'] 'attr[]'获取节点属性值 ,字典
find_all
查找所有符合的节点
find_all(name,attrs,recursive,text,**kwargs)
find,返回第一个匹配的节点
soup.find_all(name='ul')
soup.find_all(attrs={'id':'list1'})
soup.find_all(class_='list1')
#因为class是个关键字,需要加下划线
soup.find_all(text=re.compile('link'))
#text为正则表达式对象
soup.select('#id .class li') #选择节点
基本使用
from pyquery import PyQuery as pq
#字符串初始化
html = ''
doc = pq(html)
#url初始化
url = 'https://www/baidu.com'
doc = pq(url=url)
#文件初始化
filename = 'demo.html'
doc = pq(filename=filename)
doc('#x .y li')
先选择id为x的节点,再选择class为y的节点内部的所有li节点
(1)find 查找节点的所有子孙节点,children查找子节点
(2)parent 父节点 ,parents祖先节点
(3)siblings 兄弟节点
doc.find()
doc.children()
doc.parent()
doc.parents()
doc.siblings()
#所有的()可加CSS选择器
调用items() 可以得到一个生成器
for li in doc('li').items():
pass
doc.attr('class')
当返回结果包含多个节点时,调用attr(),只会得到第一个节点的值
doc.text()它会忽略掉HTNL,只返回纯文本,它将所有节点的文本连接成一个字符串
doc.htnl()返回节点内的所有html文本
pyquery提供了一系列方法来对节点进行动态修改
(1)
doc.addclass('active') #添加class='active' 这个属性
doc.removeclass('active') #删除class='active' 这个属性
(2)attr,text,html
doc.attr('name','link') 第一个参数是属性名,第二个是属性值,添加
doc.text('刘嘉强') 将整个节点内部换为纯字符串,<>刘嘉强<>
doc.html('
不传参获取属性,传参赋值
(3)remove
刘嘉强
xy
针对这种情况,直接调用text(),得'刘嘉强xy',可以先remove
节点
doc('li').find('p').remove()
首先选中
节点,然后调用remove将其移除
doc('li:first-child')#第一个li节点
doc('li:last-child')#最后一个节点
doc('li:nth-child(2)')#第二个节点
doc('li:gt(2)')#第三个及其以后的节点
doc('li:nth-child(2n)')#偶数位置的节点
doc('li:contains(second)')#包含second文本的节点