爬虫(六)xpath解析及其应用

什么是xpath:

在了解xpath前我要先了解xml

XML 被设计用来传输和存储数据。区别于html。

xml是用来存储和传输数据的 和html的不同点:

(1) html用来显示数据,xml是用来传输数据的

(2) html标签是固定的,xml标签是自定义的

而XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

常用的路径表达式:

// : 不考虑位置的查找

./ : 从当前节点往下查找

@ : 选取属性

为了方便xpath在解析中使用,我们可以安装一个xpath插件在谷歌浏览器中,用来在浏览器中先试验解析是否正确,如果无误在写入代码。

下面是xpath的使用方法:

属性定位:

//input[@id='kw']

//imput[@class='bg s_btn']

层级定位:

索引定位:

//div[@id="head"]/div/div[2]/a[@class="toindex"]

[注]索引从1开始

逻辑运算:

//input[@class="s_ipt" and @name="wd"]

模糊匹配:

contains::

//input[contains(@class, "s_i")]

所有的input,有class属性,并且属性中带有s_i的节点

starts-with: 

//input[starts-with(@class, "s")] 所有的input,有class属性,并且属性以‘s’开头

取文本:

//div[@id="u1"]/a[5]/text() 获取节点内容

//div[@id="u1"]//text() 获取节点里面不带标签的所有内容

取属性:

//div[@id="u1"]/a[5]/@href

代码中使用xpath:

from lxml import etree

两种方式使用:将html文档变成一个对象,然后调用对象的方法去查找它

(1)本地文件:

tree = etree.parse(文件名)

(2)网络文件:

tree = etree.HTML(网页字符串)

调用tree.xpath("查找路径")

下面是一个爬取段子网并用xpath解析方式进行解析的代码示例:

import urllib.request
import urllib.parse
from lxml import etree
import os

def handel_request(url, page):
	headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko)'
                  ' Chrome/63.0.3239.132 Safari/537.36'
	}
	url = url + str(page) + '/'
	return urllib.request.Request(url, headers=headers)

def parse_response(response):
	tree = etree.HTML(response)
	articles = tree.xpath('//article')
	for article in articles:
		title = article.xpath('./div/h1//text()')
		content = article.xpath('.//p//text()')
		final_content = title[0] + '\n' + '\t'.join(content) + '\n'
		with open('duanzi.html', 'a') as fp:
			fp.write(final_content)

def main():
	url = 'http://duanziwang.com/category/%E7%BB%8F%E5%85%B8%E6%AE%B5%E5%AD%90/'
	start_page = int(input("请输入您要搜索的开始页码:"))
	end_page = int(input("请输入您要搜索的结束页码:"))
	for page in range(start_page, end_page + 1):
		request = handel_request(url, page)
		response = urllib.request.urlopen(request).read().decode()
		parse_response(response)

main()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值