爬蟲2-頁面解析
阿新 • • 發佈:2018-12-11
頁面解析(取資料)
一,xml-xpath
什麼是XML: 樹形結構
XML 指可擴充套件標記語言, XML 是一種標記語言,很類似 HTML
XML 的設計宗旨是傳輸資料,而非顯示資料 XML 的標籤需要我們自行定義。
什麼是XPath?
XPath 是一門在 XML 文件中查詢資訊的語言,可用來在 XML 文件中對元素和屬性進行遍歷。
把XML裡的節點轉化為物件 文件轉化為一棵樹
nodename 選取此節點的所有子節點。 / 從根節點選取。 // 從匹配選擇的當前節點選擇文件中的節點,而不考慮它們的位置。 . 選取當前節點。 .. 選取當前節點的父節點。 @ 選取屬性。
案例
from lxml import etree xml=etree.parse('data.xml')#讀取xml檔案,結果為xml物件 xml裡標籤要成對出現 titles=xml.xpath('/bookstore/book/title') # 在data.xml文件中 下面寫法和這句結果一樣 title都在內部 # titles=xml.xpath('//book/title') # titles=xml.xpath('//title') # titles=xml.xpath('/bookstore//title') # titles=xml.xpath('book/title') # 用節點名查詢 選取此節點的所有子節點。 # titles=xml.xpath('title') 找不到 因為title沒有子節點 for t in titles: print(t.text) # 這裡為text 不是innertext #選取book元素的lang屬性值。 attrs=xml.xpath('/bookstore//title/@lang') for a in attrs: print(a) #選取book元素的lang=en的內部值。 tt=xml.xpath('/bookstore//title[@lang="en"]') for t in tt: print(t.text) # 封裝每本書的title price author # titles=xml.xpath('/bookstore/book/title') # prices=xml.xpath('/bookstore/book/price') # authors=xml.xpath('/bookstore/book/author') # books=[] # for i in range(len(titles)): # book={"title":titles[i].text,"price":prices[i].text,"author":authors[i].text} # books.append(book) # print(books)
二,html(用xpath操作html檔案)
import lxml.html etree = lxml.html.etree #html=etree.parse('liepin.html') # 會出錯 標籤沒有成對出現 用下面的方式 parser = etree.HTMLParser(encoding="utf-8") # 用來讀取html檔案 html = etree.parse("liepin.html", parser=parser) # html 為物件型別 #result=etree.tostring(html,encoding='utf-8').decode() # 轉化為字串 names=html.xpath('//div[@class="job-info"]/span/a') for n in names: print(n.text) workyears=html.xpath('//div[@class="job-info"]/p[@class="condition clearfix"]/span[last()]') for n in workyears: print(n.text) # 封裝 data=html.xpath('//div[@class="job-info"]/p[@class="condition clearfix"]/span') positions = [] pos = {"salary": "", "edu": "", "work_years": ""} print(len(data)) for n in range(0, len(data), 3): pos = {"salary": data[n].text, "edu": data[n + 1].text, "work_years": data[n + 2].text} positions.append(pos) print(positions)
三,css
lxml 只會區域性遍歷,而Beautiful Soup 是基於HTML DOM的,會載入整個文件,解析整個DOM樹
BeautifulSoup 用來解析 HTML 比較簡單,支援CSS選擇器、Python標準庫中的HTML解析器,也支援 lxml 的 XML解析器。
Beautiful Soup 3 目前已經停止開發,推薦現在的專案使用Beautiful Soup 4。使用 pip 安裝即可:pip install beautifulso
from bs4 import BeautifulSoup
html=BeautifulSoup(open('liepin.html',encoding='utf-8'),'lxml')
ts=html.select('div.job-info p.condition a')
for t in ts:
print(t.string)# 拿到內容
#print(t['href'])# 拿到屬性值
#print(t.attrs)# 拿到所有屬性
tt=html.select('div.job-info p.condition span')
for t in tt:
print(t.string)# 拿到內容