什么是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()