(最全)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()//生成器型別
(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()
特:偽類選擇器
選擇第一個節點,最後一個節點,奇偶數節點,包含某一文字節點