1. 程式人生 > >爬蟲2-頁面解析

爬蟲2-頁面解析

頁面解析(取資料)

一,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)# 拿到內容