Python解析库的使用

解析库的使用

  • XPath
    • 使用Xpath
    • Beautiful Soup
      • 方法选择器
  • Pyquery
    • 初始化
    • 基本CSS选择器
    • 查找节点
    • 遍历
    • 获取信息

XPath

使用Xpath

在XML文档中查找信息的语言:

  1. XPath概览 提供了简洁明了的路劲选择表达式;
  2. XPath常用规则:
表达式 描述
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类型
  1. 所有节点:
```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)
  1. 节点轴选择
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::*')#获取当前节点之后的所有同级节点

Beautiful Soup

  • 基本用法:
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

  • 关联选择
    1.子节点和子孙节点
    print(soup.p.contents)#返回类型为列表
    contents得到的结果是直接子节点的列表
    children,返回结果是生成器类型
    descendants,得到所有子孙节点
    2.父节点和祖父节点
    parent:仅是选择节点的直接父节点
    parents:获取所有祖父节点
    3.兄弟节点
    soup.a.next_sibling获取下一个兄弟元素
    soup.a.previous_sibling获取上一个兄弟元素
    list(enumerate(soup.a.next_siblings)获取后面的兄弟节点
    list(enumerate(soup.a.previous_siblings)获取前面的兄弟节点

方法选择器

  • CSS选择器
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]))

Pyquery

初始化

  • 字符串初始化
from pyquery import PyQuery as pq
doc=pq(html)
print(doc('li'))#字符串初始化
  • URL初始化
doc=pq(url='https://cuiqingcai.com')#URL初始化
print(doc('title'))
  • 文件初始化
doc=pq(filename='demo.html')
print(doc('li'))

基本CSS选择器

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的用法一致

  • 伪类选择器

你可能感兴趣的:(python爬虫,python,xpath,爬虫)