xpath 解析
-
模块安装 :
-
pip install lxml
-
xpath的解析原理
- 实例化一个etree类型的对象,且将页面源码数据加载到该对象中
- 需要调用该对象的xpath方法结合着不同形式的xpath表达式进行标签定位和数据提取
-
etree对象的实例化
- etree.parse(fileNane) 加载本地
- etree.HTML(page_text) 加载网络请求的响应
-
xpath方法返回的永远是一个列表
-
标签定位
-
在xpath表达式中最最侧的 / 表示的含义是说,当前定位的标签必须从根节点开始进行定位
-
xpath表达式中最左侧的 // 表示可以从任意位置进行标签定位
-
xpath表达式中非最左侧的 // 表示的是多个层级的意思
-
xpath表达式中非最左侧的 / 表示的是一个层级的意思
-
属性定位://tagName[@arrtName='value']
-
索引定位://tagName/li[3]
-
定位条件可以多个,使用| 分开
from lxml import etree tree = etree.parse('./test.html') tree.xpath('/html/head/meta')[0] #绝对路径 tree.xpath('//meta')[0] #相对路径,将整个页面源码中所有的meta进行定位 #属性定位 tree.xpath('//div[@class="song"]') #索引定位 tree.xpath('//div[@class="tang"]/ul/li[3]') #该索引是从1开始 #取文本 tree.xpath('//p[1]/text()') #取属性 tree.xpath('//a[@]/@href') tree = etree.parse('./test.html') tree.xpath('/html/head/meta')[0] #绝对路径 tree.xpath('//meta')[0] #相对路径,将整个页面源码中所有的meta进行定位 #属性定位 tree.xpath('//div[@class="song"]') #索引定位 tree.xpath('//div[@class="tang"]/ul/li[3]') #该索引是从1开始 #取文本 tree.xpath('//p[1]/text()') tree.xpath('//div[@class="song"]//text()') #取属性 tree.xpath('//a[@]/@href') # 多个条件 div.xpath('./div[1]/a[2]/h2/text() | ./div[1]/span[2]/h2/text()')[0]
-
-
提取数据
- 取文本:
- /text():取直系的文本内容
- //text():取所有的文本内容
- 取属性直:
- tag/@attrName
# 需求:爬取boss的招聘信息 from lxml import etree headers = { # 反扒策略 'User-Agent':', 'cookie':'' } url = 'https://www.zhipin.com/job_detail/?query=python%E7%88%AC%E8%99%AB&city=101010100&industry=&position=' page_text = requests.get(url,headers=headers).text #数据解析 tree = etree.HTML(page_text) li_list = tree.xpath('//div[@class="job-list"]/ul/li') for li in li_list: # 需要将li表示的局部页面源码数据中的相关数据进行提取 # 如果xpath表达式被作用在了循环中,表达式要以./或者.//开头 detail_url = 'https://www.zhipin.com'+li.xpath('.//div[@class="info-primary"]/h3/a/@href')[0] job_title = li.xpath('.//div[@class="info-primary"]/h3/a/div/tex t()')[0] salary = li.xpath('.//div[@class="info-primary"]/h3/a/span/text()')[0] company = li.xpath('.//div[@class="info-company"]/div/h3/a/text()')[0] #对详情页的url发请求解析出岗位职责 detail_page_text = requests.get(detail_url,headers=headers).text tree = etree.HTML(detail_page_text) job_desc = tree.xpath('//div[@class="text"]//text()') job_desc = ''.join(job_desc) print(job_title,salary,company,job_desc)
-
乱码处理
-
对获取到的内容先编码再转码:
img_name = img_name.encode('iso-8859-1').decode('gbk')
-
- 取文本:
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:爬虫-数据解析-xpath - Python技术站