c 的xpath解析html,(最全)Xpath、Beautiful Soup、Pyquery三种解析库解析html 功能概括...

一、Xpath 解析

xpath:是一种在XMl、html文档中查找信息的语言,利用了lxml库对HTML解析获取数据。

Xpath常用规则:

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

  // :从当前节点选取子孙节点

  / :从当前节点选取子节点

  . : 选取当前节点

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

 @ : 选取属性

1.初始化html

etree.parse()是初始化html构造一个XPath解析对象;

etree.tostring()是修复html文件中代码,把缺的头或尾节点补齐;

result.deode('utf-8')修复后的HTML代码是字节类型,转化成字符串;

from lxml import etreed

html=etree.parse('c:/.../test.html',etree.HTMLParser())

result=etree.tostring(html)

result.decode('utf-8')

2.获取所有节点

Xpath规则一般用 // 开头

例:

html.xpath('//*') //获取所有的节点

html.xpath('//li') //获取所有li节点

3.子节点、子孙节点

html.xpath('//li/a') //所有li下是所有直接a子节点

html.xpath('//ul//a') //所有ul下的子孙a节点

4.父节点

html.xpath('//a[@href="links.html"]/../@class')

//找到所有a节点中href为links.html的父节点的class值

// .. 来实现查找父节点

5.属性匹配

html.xpath('//li[@class="item-0"]') //找到class值为item-0是节点

6.文本获取

html.xpath('//li[@class="item-0"]/a/text()')

或html.xpath('//li[@class="item-0"]//text()')

7.属性获取

html.xpath('//li/a/@href') //找到li下a中的href属性值

8.属性多值匹配

html.xpath('//li[contains(@class,"li")]/a/text()') //只要节点属性class中包含li就能匹配出来

9.多属性匹配

html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()') //匹配节点属性class值为li,name值为item的节点

二、Beautiful Soup 解析

Beautiful Soup是HTML或XML解析库。通过解析文档为用户提供需要抓取的的数据。

需要解析器:lxml HTML解析库、lxml XML解析库、Python标准库、html5lib

基本用法:

from bs4 import BeautifulSoup

soup=BeautifulSoup(html,'lxml')

1.soup.prettify()

调用prettify()方法把要解析的字符串以标准的缩进格式输出

2.节点选择器:

例:soup.title.string

(1)选择元素: soup.title、soup.title.sring soup.head soup.p (2)提取信息:   1)获取节点名称:soup.title.name   2) 获取属性:soup.p.attrs、soup.p.attrs['name']   3) 获取内容:soup.p.string (3)嵌套选择: soup.head.title.string (4)关联选择:   enumerate() //生成器类型python

(1)soup.p.contents //p节点下的直接子节点列表

(2)soup.p.descendants //p节点下的所有子孙节点(生成器类型)

(3)父节点和祖先节点:soup.p.partent、soup.p.parents

(4)兄弟节点:

soup.a.next_sibling

soup.a.previous_sibling

soup.a.next_siblings

enumerate(soup.a.pervious_siblings)

(5)提取信息:soup.a.next_sibling.string

##### 3.方法选择器: find_all(name,attrs,recursive,text,**kwargs)python

(1)name:find_all(name='li')

(2)attrs:find_all(attrs={'id':'list-1'})、find_all(class_='element')

(3)text:匹配节点的文本,find_all(text='字符串或正则表达式')

特:find()用法与fand_all一样,只不过只匹配第一个元素 ##### 4.css选择器 调用select()方法,传入相应css选择器python

soup.select('.panel.panel-heading')

soup.select('ul li') //所有ul下的所有li

soup.select('#list-2.element')

python

(1)嵌套选择:

for ul in soup.select('ul'):

ul.select('li')

(2)获取属性:

for ul in soup.select('ul')

ul.attrs['id']

ul['id']

(3)获取文本:

for li in soup.select('li'):

li.get_text()

lli.string

### 三、 pyquery 解析 1.初始化: (1)字符串初始化:Python

html=''' *******

'''

from pyquery import PyQuery as pq

doc=pq(html)

print(doc('li'))

(2)URL初始化

doc=pq(url=" https:/ ... ")

(3)文件初始化

doc=pq(filename='demo.html')

print(doc(li))

##### 2.基本css选择器

doc('#container .list li') //id 为container,class为list下的所有li

##### 3.查找节点python

(1)子孙节点、子节点

.find():查找所有子孙节点

items=doc('.list')

items.find('li')

.children():查找子节点

items=doc('.list')

items.children('.active')

(2)父节点

doc=pq(html)

items=doc('.list')

items.parent()

祖先节点

items.parents()

(3)兄弟节点

doc=pq(html)

li=doc('.lsit .item-0.active')

li.siblings('.active')

##### 4.遍历 用items()函数生成列表生成器进行遍历Python

doc=pq(html)

lis=doc('li').items()

for li in lis:

print(li)

```

5.获取信息

(1)获取属性

a=doc('.item-0.active a')

print(a.attr('href'))或print(a.attr.href)

特:attr只会输出第一个a节点属性,要用items()遍历

(2)获取文本

.text()

a=doc('.item-0.active a')

a.text() //text()函数会输出所有的li文本内容

.html()

li=doc('li')

li.html() //html()只会输出第一个li节点内的HTML文本

6.节点操作

(1) removeClass addClass

li=doc('.item-0.active')

print(li)

li.removeClass('active') //移除active的class

li.addClass('active') //增加active的class

(2) attr text html

li.attr('name','link') //增加属性name=link

li.text('changed item') //改变文本 changed item

li.html(changed item ) //改变HTML

(3) remove()

wrap=doc('.wrap')

wrap.find('p').remove() //删除wrap中p节点

wrap.text()

特:伪类选择器

选择第一个节点,最后一个节点,奇偶数节点,包含某一文本节点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值