1. 程式人生 > >(最全)Xpath、Beautiful Soup、Pyquery三種解析庫解析html 功能概括

(最全)Xpath、Beautiful Soup、Pyquery三種解析庫解析html 功能概括

獲取信息 file 取數 hang desc previous lib 則表達式 panel

一、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()    //生成器類型
(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)

(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選擇器

soup.select(‘.panel.panel-heading‘)
soup.select(‘ul li‘) //所有ul下的所有li
soup.select(‘#list-2.element‘)
(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)字符串初始化:

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.查找節點
(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()函數生成列表生成器進行遍歷

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(<span>changed item </span>)   //改變HTML

(3) remove()
wrap=doc(‘.wrap‘)
wrap.find(‘p‘).remove() //刪除wrap中p節點
wrap.text()

特:偽類選擇器
選擇第一個節點,最後一個節點,奇偶數節點,包含某一文本節點

(最全)Xpath、Beautiful Soup、Pyquery三種解析庫解析html 功能概括