Python爬虫学习第三章-4.2-使用xpath解析爬取58二手房的房源标题信息

it2025-05-18  4

Python爬虫学习第三章-4.2-使用xpath解析爬取58二手房的房源标题信息

  这一节主要是使用xpath解析爬取58二手房的房源标题信息

58同城二手房的网址:58同城二手房

  总的思路是先爬取总的页面源码数据,再通过实例化的etree对象调用path方法定位到含有标题的标签,从而获取数据.

回顾一下使用xpath进行数据解析的步骤:

实例化一个etree类的的对象,并且需要将被解析的页面源码数据加载到该对象中。调用etree对象中的xpath方法并结合着xpath表达式实现标签的定位和内容的捕获(捕获到的是标签或者标签属性中的文本内容)。

步骤:

首先爬取网页源码数据,指定url,进行UA伪装,没有参数不需要进行参数处理,发送请求并获取数据,放在page_text中;然后使用tree = etree.HTML(page_text)实例化一个etree对象tree,并为tree加载先前获取的页面源码数据。再调用etree对象中的xpath方法并结合着xpath表达式实现标签的定位和内容的捕获。通过li_list = tree.xpath('//ul[@class="house-list-wrap"]/li') 获取含有标题信息的a标签,因为获取的是所有的li标签,所以在循环中取每个li标签中a标签中的标题等信息,如title = li.xpath('./div[2]/h2/a/text()')[0]提取标题信息,然后持久化存储即可。

代码注意点:

xpath返回的列表中是element对象,对应页面源码数据,可以调用xpath函数,如for循环中的li.xpath('./div[2]/h2/a/text()')[0]。一定要注意’./div[2]/h2/a/text()‘最前面的点’.’, './‘表示的是从li标签的这部分源码的最左侧的li开始的,局部解析中’.'一定不要忘了,如果不加点,只有一个斜线,则表示从整个文件的最左侧开始,也就是html。

代码:

#爬取58二手房的房源信息 import requests from lxml import etree if __name__=="__main__": #使用xpath进行数据解析的步骤:先实例化一个etree类的的对象,并且需要将被解析的页面源码数据加载到该对象中 #先爬取网页源码数据 url = "https://qd.58.com/ershoufang/" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36' } page_text = requests.get(url=url,headers=headers).text #实例化一个etree对象,并加载源码数据 tree = etree.HTML(page_text) #调用etree对象中的xpath方法并结合着xpath表达式实现标签的定位和内容的捕获(捕获到的是标签或者标签属性中的文本内容) li_list = tree.xpath('//ul[@class="house-list-wrap"]/li') #存储的就是li标签对象,返回的是一个列表,里面的元素是一个包含标签内容的Element类型的对象 fp = open('./58.txt','w',encoding='utf-8') #从每一个li标签中解析出a标签 for li in li_list: title = li.xpath('./div[2]/h2/a/text()')[0] #这里的每个li是element对象,对应页面源码信息,可以调用xpath方法(利用etree.HTML,将字符串转化为Element对象,Element对象具有xpath的方法) price = li.xpath('./div[3]/p[2]/text()')[0] total_price = li.xpath('./div[3]/p[1]/b/text()')[0] #'./'表示的就是从li标签的这部分源码的最左侧的li开始的,局部解析'.'一定不要忘了,如果不加点,只有一个斜线,则表示从整个文件的最左侧开始,也就是html print(str(title).ljust(30),str("房价为:"+str(price)).ljust(15),str("总价格为:"+str(total_price)+'万').ljust(15),sep='|') fp.write(title+" 房价为:"+price + " ;总价格为:"+total_price+"万"+'\n')

运行截图如下:

最新回复(0)