Xpath

今天来学习一下Xpath吧,这是python的第三种精准爬取方法
首先我们需要掌握xml。
用来传输存储数据 是可扩展的标记语言 自行定义标签

htmlxml
用来显示数据存储数据
固定标签自定义标签

xpath在xml文档中查找指定元素信息,是一种路径表达式
xpath语法

  • // 从任意位置找到你 不考虑位置
  • . 选取当前节点
  • ./ 从当前节点开始往下开始找
  • … 选取当前节点的父节点
  • …/ 从当前节点的父节点下开始找
  • @ 选取属性

bookstore根元素所有子节点
/bookstore 选取根元素bookstore
bookstore/book 选取bookstore中的所有的book元素(孙子节点找不到,是直接子节点)
//选取所有的 book元素,从任意位置开始了
bookstore//book 选取bookstore中的所有book元素(孙子节点都可以找到)
/bookstore/book[1] 第一个book元素
/bookstore/book[last()-1] 倒数第二个
/bookstore /book[position()❤️] 提取前两个属性
//title[@lang] 所有的带有lang属性的title
//title[@lang = ‘eng’] 所有的 lang属性为eng的元素

如果安装无效则看这个网站进行设置
https://www.cnblogs.com/ljxh/p/11222898.html
当然我也会在我博客资源里提供安装包的
其实xpath也是一个插件,安装到浏览器,我们可以ctrl shift x呼出xpath控制台

属性定位
//input[@id=‘kw’] 找到所有的带有属性id值为kw的input //input[@class="*** **"] 多个class用空格隔开class就行了
索引与属性查找可以一起使用
//div[@class="
" and @id="#"] 多个属性可以and 模糊匹配
//input[contains(@class,“s_i”)] 所有的input并且含有class为s_i的
//input[start-width(@class,“a”)] 所有的input带有class为a开头的

import time
import urllib.request
import urllib.parse
from lxml import etree
import json

def parse_content(content):
	#生成对象
	tree = etree.HTML(content);
	oli_list = tree.xpath('//ul[@class="list-box"]/li[1]')
	# ul[@class='list-box']/li[1]/div[@class='content']/a
	
	for odiv in oli_list:
		title = odiv.xpath('//div[@class="head"]/h2[@class="s2"]/br/text()')
		text = odiv.xpath('./div[@class="content"]/a/br/text()')
		print(title)

def handle_request(url,page):
	headers = {
		'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
	}
	#url = url % page;
	url = url.format(page)
	#print(url)
	request = urllib.request.Request(url = url,headers = headers);
	return request;

def main():
	#start_page = int(input("输入起始页码"))
	#end_page = int(input("输入结束页码"))
	start_page = 1
	end_page = 1
	url  = 'http://www.haoduanzi.com/category/?1-{0}.html'
	for page in range(start_page,end_page+1):
		#构建请求对象
		request = handle_request(url,page)
		#获得相应信息
		content =  urllib.request.urlopen(request).read().decode()
		#print(content)
		parse_content(content)

if __name__ == '__main__':
	main()
5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值