在XML文档中查找信息的语言:
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
e.g:title[@lang=‘eng’],选择所有名称为title,属性lang的值为eng的节点;
4. 实例
from lxml import etree
html=etree.parse('./test.html',etree.HTMLParser())#初始化
result=etree.tostring(html)#输出修正后的HTML代码,结果是bytes类型
print(result.decode('utf-8'))#转成str类型
```Javascript
result=html.xpath('//*')#选取所有节点
result=html.xpath('//li/a')#子节点
result=html.xpath('//a[@href="link4.html/parent::*/@class')#先选取a再获取其父节点,然后再获取其class属性
result=html.xpath('//li[@class="item-0"]')#属性匹配
7. 文本获取
```javascript
from lxml import etree
html=etree.parse('./test.html',etree.HTMLParser())
result=html.xpath('//li[@class="item-0"]/a/text()')#获取文本内容整洁
result=html.xpath('//li[@class="item-0"]//text()')#保证最全面的文本信息,但可能会夹杂一些换行符等特殊字符
print(result)
8.多属性匹配
html=etree.HTML(text)
result=html.xpath('//li[1]/a/text()')#选取第一个li节点
result=html.xpath('//li[last()]/a/text()')#选取最后一个节点
result=html.xpath('//li[position()<3]/a/text()')#选取位置小于3的节点
result=html.xpath('//li[last()-2]/a/text()')#选取倒数第三个li节点
print(result)
html=etree.HTML(text)
result=html.xpath('//li[1]/ancestor::div')#选择div这个祖先节点
result=html.xpath('//li[1]/attribute::*')#获取节点的所有属性
result=html.xpath('//li[1]/child::a[@href="link1.html"]')#获取所有直接子节点
result=html.xpath('//li[1]/descendant::span')#获取子孙节点,限定span
result=html.xpath('//li[1]/following::*[2]')#获取当前节点之后的所有节点,加了索引只获取第二个后续节点
result=html.xpath('//li[1]/following-sibling::*')#获取当前节点之后的所有同级节点
from bs4 import BeautifulSoup
soup=BeautifulSoup(html,'lxml')#第二个参数解析器类型
print(soup.prettify())
print(soup.title.string)
prettify()方法可以把奥解析的字符串以标准的缩进格式输出、Beautiful Soup可以自动更正格式
节点选择器
直接调用节点的名称就可以选择节点元素,再调用string属性就可以得到节点内的文本了。当有多个节点时,只会选择到第一个匹配的节点
提取信息
(1)获取名称:name:soup.title.name
(2) 获取属性:attrs:选取节点后调用,soup.p.attrs,soup.p.attrs[‘name’]
(3)获取内容:string:soup.p.string
嵌套选择
print(soup.head.title)
print(type(soup.head.title))
print(soup.head.title.string)
The Dormouse's story
The Dormouse's story
from bs4 import BeautifulSoup
soup=BeautifulSoup(html,'lxml')
print(soup.select('.panel .panel-heading'))
print(soup.select('ul li'))
print(soup.select('#list-2 .element'))
for li in soup.select('li'):
print('Get Text:',li.get_text())
print(type(soup.select('ul')[0]))
from pyquery import PyQuery as pq
doc=pq(html)
print(doc('li'))#字符串初始化
doc=pq(url='https://cuiqingcai.com')#URL初始化
print(doc('title'))
doc=pq(filename='demo.html')
print(doc('li'))
doc=pq(html)
print(doc('#container .list li'))
print(type(doc('#container .list li')))
doc=pq(html)
items=doc('.list')
lis=items.find('li')
lis=item.children('.active')
container=items.parent()#返回类型PyQuery类型
parents=item.parents()#
find()会将符合条件的所有节点选择出来,结果类型时PyQuery类型,查找范围是节点的所有子孙节点,children()方法只查找子节点,父节点:parent(),祖父节点:parents(),兄弟节点:sibings()
#单个节点
li=doc('.item-0.active')
print(li)
print(str(li))
#多个节点
lis=doc('li').items()
for li in lis:
print(li ,type(li))
from pyquery import as pq
doc=pq(html)
a=doc('.item-0.active a')
print(a,type(a))
print(a.attr('href'))#获取属性,返回结果只有一个节点
#多节点遍历
a=doc('a')
for item in a.items():
print(item.attr('href'))
from pyquery import PyQuery as pq
doc=pq(html)
a=doc('.item-0.active a')
print(a)
print(a.text())#只返回纯文本内容
print(li.html())#获取节点内部的HTML内容
如果得到的结果是多个节点,html()方法返回的是第一个节点的内部HTML文本,而text()则返回了所有的节点内部的纯文本
调用items()方法后,会得到一个生成器,遍历后就可以逐个得到li节点对象,类型也是PyQuery类型。
from pyquery import PyQuery as pq
doc=pq(html)
li=doc('.item-0.active')
print(li)
li.remove_class('active')
print(li)
li.add_class('active')
print(li)
结果:
移除active这个class又添加回来
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-0"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
attract()只传第一个参数:获取这个属性值,传入第二个修改属性值
text()和html()传入参数进行赋值。
from pyquery import PyQuery as pq
doc=pq(html)
wrap=doc('.wrap')
wrap.find('p').remove()#选择p节点,然后移除
其他节点操作和jQuery的用法一致