python爬虫学习(十二)xpath解析爬取58二手房

xpath解析:最常用且便捷高效的解析方式,通用性

1、实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中
2、调用etree对象中的xpath方法结合这xpath表示式实现标签的定位和内容的捕获

环境的安装

1、pip install lxml

如何实例化一个etree对象 :from lxml import etree

1、将本地的html文档中的源码数据加载到etree对象中
    etree.parse(filepath)
2、可以从互联网获取的源码数据加载到该对象中
    etree.HTML(page_text)

xpath(‘xpath表达式’)

/表示从根节点开始定位,表示一个层级
r=tree.xpath('/ht,l/body/div')
//表示的是多个层级,可以表示从任意位置开始定位
r=tree.xpath('/html//div')
r=tree.xpath('//div')

属性定位

//div[@属性名='属性值'] tag[@属性名=属性值]

索引定位

#(索引下标从1开始计算)
r= tree.xpath('//div[@属性名=属性值]/标签名[索引下标]')

取文本

标签中直系文本内容
/text()      #列表
/text()[下标]  #文本

标签中非直系(所有文本内容)
//text()

取属性

/@attrname(属性名)
# -*- coding: utf-8 -*-
import requests
from lxml import etree
if __name__ == '__main__':
    #爬取页面源码数据
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
    }
    url='https://bj.58.com/ershoufang/'
    page_text = requests.get(url=url,headers=headers).text

    #数据解析
    tree = etree.HTML(page_text)
    #li标签对象列表
    li_list=tree.xpath('//ul[@class="house-list-wrap"]/li')
    #print(li_list)
    fp = open('58.txt','w',encoding='utf-8')
    for li in li_list:
        #./表示li标签   不加.表示的是根标签
        title = li.xpath('./div[2]/h2/a/text()')[0]
        # 房屋部分数据
        baseinfo= li.xpath('./div[2]/p/span/text()')
        #从列标中取出数据,这种方式总觉得不太好,望指正
        data = baseinfo[0]+'\t'+baseinfo[1]+'\t'+baseinfo[2]
        #价格
        price = li.xpath('./div[3]/p[2]/text()')[0]
        print(title+'\n'+data+'\n'+price+'\n\n')
        fp.write(title+'\n'+data+'\n'+price+'\n\n')

发布了23 篇原创文章 · 获赞 0 · 访问量 669

猜你喜欢

转载自blog.csdn.net/haimian_baba/article/details/103809447