文章目录
背景:xpath解析:最常用且最便捷高效的一种解析方式。通用性最高。
一、xpath解析原理
- 1.实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
- 2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。
二、环境的安装
pip install lxml
三、如何实例化一个etree对象
第一步:引入对象
from lxml import etree
第二步:加载对象
方法一:将本地的html文档中的源码数据加载到etree对象中
etree.parse(filePath)
方法二:将从互联网上获取的源码数据加载到该对象中
etree.HTML('page_text')
etree.HTML('page_text')
第三步:使用etree
xpath('xpath表达式')
四、表达式说明
https://blog.csdn.net/xiaobai729/article/details/124079260
- /:表示的是从根节点开始定位。表示的是一个层级。
- //:表示的是多个层级。可以表示从任意位置开始定位。
-
属性定位:
//div[@class='song'] tag[@attrName="attrValue"]
-
索引定位:
//div[@class="song"]/p[3]
索引是从1开始的。 -
取文本:
-
/text()
获取的是标签中直系的文本内容 -
//text()
标签中非直系的文本内容(所有的文本内容)
-
-
取属性:
/@attrName ==>img/src
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from lxml import etree
if __name__ == "__main__":
#实例化好了一个etree对象,且将被解析的源码加载到了该对象中
tree = etree.parse('test.html')
# r = tree.xpath('/html/body/div') #获取html下面的body下面的div
# r = tree.xpath('/html//div')#获取html下面的多个层级的div
# r = tree.xpath('//div')#获取多个层级的div
# r = tree.xpath('//div[@class="song"]')#获取多个层级的div并且标签里面的class为song
# r = tree.xpath('//div[@class="tang"]//li[5]/a/text()')[0]#获取多个层级的div并且标签里面的class为tang下面的多个层级的第五个li标签下的a标签里面的内容
# r = tree.xpath('//li[7]//text()')#多个层级的第七个li下的所有内容
# r = tree.xpath('//div[@class="tang"]//text()')#多个层级的div标签下的class为tang下的所有内容
r = tree.xpath('//div[@class="song"]/img/@src')#多个层级的div标签下的class为song下的img属性的内容
print(r)
五、实战
爬取强国内容
import requests
from lxml import etree
if __name__ == '__main__':
content = input("请输入内容:")
# step_1:指定url
url = 'http://www.syiban.com/search/index/init.html?modelid=1&q=' + content
# step_2:发起请求
# get方法会返回一个响应对象
response = requests.get(url=url)
# step_3:获取响应数据.text返回的是字符串形式的响应数据
page_text = response.text
tree = etree.HTML(page_text)
question = tree.xpath('//span[@class="title_color"]')
answer = tree.xpath('//div[@class="yzm-news-right"]/p/span')
print(question)
for index, value in enumerate(question):
print(question[index].xpath('string()'))
print(answer[index].xpath('string()'))
# step_4:持久化存储
with open('./强国.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('爬取数据结束!!!')