xpath
-可以提取xml和html网页中的数据的语言
xpath语法
xpath helper插件:帮助我们从”elements”中定位数据
1.选择节点(便签)
/html/head/meta :能够选中html下head下所有的meta标签
2.// :能够从任意节点开始选择
//li 表示当前所有页面中的标签
/html/head//link :head下的所有link标签
3.@符号的用途
–选择具体某个元素
//ul[@class=”toolbar”]/li :选择class=”toolbar”的ul下的li
–获取某一属性的值
a@/href:选择a的href的值
4.获取文本 text()
//div[@class=”w-header”]/span/text():获取span下的文本
5. ./xx当前节点下XX的标签
lxml
pip install lxml
基本用法:
from lxml import etree
element=etree.HTML(“html字符串或者xml文本”)—element对象
element.xpath()—可以使用xpath语法获取数据
”’
实例演示–糗事百科数据抓取
import requests
from lxml import etree
import json
#创建类
class QiubaiSpider():
#定义构造器
def __init__(self):
self.url_temp="https://www.qiushibaike.com/8hr/page/{}/" #通过翻页观察规律
self.headers={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"
}
#定义功能函数---得到url列表
#利用列表推导式及format方法
url_list =[self.url_temp.format(i) for i in range(1,14)]
return url_list
#定义功能函数---得到html字符串
def get_html(self,url):
print("正在对 %s 发出请求" % url)
res=requests.get(url,headers=self.headers)
return res.content.decode()
#定义功能函数---解析html字符串
def parse_html(self,html_str):
#建立element对象
html=etree.HTML(html_str)
#分组---便于for遍历取值
div_list=html.xpath("//div[@id='content-left']/div")
content_list=[]
for div in div_list:
item = {}
item["author_name"]=div.xpath(".//h2/text()")[0].strip() if len(div.xpath(".//h2/text()")) else None
item["content"]=div.xpath(".//div[@class='content']/span/text()")
item["content"]=[i.strip() for i in item["content"]]
item["img"]=div.xpath(".//img[@class='illustration']/@src")
#注意图片链接的完整性与三元运算符赋值操作
item["img"]="https:"+ item["img"][0] if len(div.xpath(".//img[@class='illustration']/@src")) else None
content_list.append(item)
return content_list
#定义功能函数---保存数据
def save_content_list(self,content_list):
with open("qiubai.txt","a",encoding="utf-8") as f:
for content in content_list:
#将python字典数据转为为json字符串
f.write(json.dumps(content,ensure_ascii=False))
f.write("\n")
print("保存成功")
#定义run方法---实现主要逻辑
def run(self):
# 1.根据url地址规律构造url_list
url_list=self.get_url_list()
# 2.发送请求,获取响应
for url in url_list:
html_str=self.get_html(url)
# 3.提取数据
content_list=self.parse_html(html_str)
# 4.保存
self.save_content_list(content_list)
if __name__ == '__main__':
qiubai=QiubaiSpider()
qiubai.run()