python爬虫——xpath
解析原理
- 实例化一个etree对象,且将网页源码数据加载到该对象中
- 调用etree对象中的xpath方法,使用xpath表达式实现标签的定位和内容的捕获
环境的安装:lxml(from lxml import etree)
etree对象的实例化
- 用本地的源码数据进行实例化
etree.parse(‘path’) - 将从互联网中捕获的源码数据加载到该对象中
etree.HTML(‘page_text’)
xpath表达式:
- /:表示的是从根节点开始定位,表示的是一个层级。
- //: 表示的多个层级,若在开头表示为从任一个标签开始定位
- 属性定位:[@attrName=“attrView” ]
例如:[@div=“song”] - 索引定位:标签[索引值] 。索引从1开始
例如://div[@div=“song”]/li[5]/a - 获得文本内容:返回值为列表
/text():只能获取标签直系的文本内容
//text():能获取标签下的所有内容 - 获得属性:返回值为列表
/@属性值
例如:/@src - 同时捕获多个标签: | 标签a | 标签b
实例:58同城标题爬取
import requests
from lxml import etree
if __name__ == '__main__':
url = 'https://wh.58.com/ershoufang/'
headers = {
'User-Agent':'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36'
}
page_text = requests.get(url=url, headers=headers).text
#创建etree对象
tree = etree.HTML(page_text)
#使用xpath表达式实现定位
list_li = tree.xpath('//ul[@class="house-list-wrap"]/li')
fp = open('./58.txt', 'w', encoding='utf-8')
for li in list_li:
#,表示从该li标签开始定位,所得到的列表取第一个元素
title = li.xpath('./div[2]/h2/a/text()')[0]
fp.write(title + '\n')
print('over')
fp.close()