前言
本節學習數據解析的xpath
1、基礎用法
import re
import requests
# 安裝支持 解析html和XML的解析庫 lxml
# pip install lxml
from lxml import etree
url = 'http://news.baidu.com/'
headers = {
"User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
# response.text 不太準確 轉碼 是靠推測
data = requests.get(url, headers=headers).content.decode()
# 1.轉解析類型
xpath_data = etree.HTML(data)
# xpath 語法 1. 節點 /
# 2. 跨節點: //
# 3. 精確的標籤: //a[@屬性="屬性值"]
# 4. 標籤包裹的內容 text()
# 5. 屬性:@href
# xpath--s數據類型---list
# 2調用 xpath的方法
result = xpath_data.xpath('/html/head/title//text()')
result = xpath_data.xpath('//a/text()')
result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]/text()')
result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]/@href')
result = xpath_data.xpath('//li/a/text()')
print(result)
2、標籤的取法
from lxml import etree
html = """
<html>
<body>
<ul>
<li>1
<a href="">子</a>
</li>
<li>2
<a href="">子</a>
</li>
<li>3
<a href="">子</a>
</li>
<li>4
<a href="">子</a>
</li>
<li>5
<a href="">子</a>
</li>
</ul>
</body>
</html>
"""
# 1.轉類型
x_data = etree.HTML(html)
# 2.xpath 下標 是從 1開始; 只能取 平級關係的標籤
result = x_data.xpath('//li[5]/text()')
result = x_data.xpath('/html/body/ul/li/a/text()')
result = x_data.xpath('//a[2]') #跨節點
print(result)
3、例子
import requests
from lxml import etree
import json
class BtcSpider(object):
def __init__(self):
self.base_url = 'http://8btc.com/forum-61-'
self.headers = {
"User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
self.data_list = []
# 1.發請求
def get_response(self, url):
response = requests.get(url, headers=self.headers)
# 網頁的 編碼到底 是 gbk 還是 urf-8 head--meta-charset=""
# 原因 是 抓取 網頁的 編碼 就是 gbk的 所以 解碼的時候 也是要gbk
# data = response.content.decode('gbk')
data = response.content
return data
# 2.解析數據
def parse_data(self, data):
# 使用xpath 解析當前頁面 所有的 新聞title 和url 保存
# 1.轉類型
x_data = etree.HTML(data)
# 2.根據xpath路徑解析
# 路徑 1. 純手寫 2. 藉助瀏覽器的 右擊 粘貼xpath路徑; 需要修改
title_list = x_data.xpath('//a[@class="s xst"]/text()')
# title_list = x_data.xpath('//form[@id="moderate"]/div/div[2]/div/a[@class="s xst"]/text()')
url_list = x_data.xpath('//a[@class="s xst"]/@href')
for index, title in enumerate(title_list):
news = {}
# print(index)
# print(title)
news['name'] = title
news['url'] = url_list[index]
self.data_list.append(news)
# 3.保存數據
def save_data(self):
# 將 list---str
data_str = json.dumps(self.data_list)
with open('05btc.json', 'w') as f:
f.write(data_str)
# 4.啓動
def run(self):
for i in range(1, 5):
# 1.拼接 完整url
url = self.base_url + str(i) + '.html'
print(url)
# 2.發請求
data = self.get_response(url)
# 3.做解析
self.parse_data(data)
# 4.保存
self.save_data()
BtcSpider().run()
結語
多多練習熟練