python xpath提取链家二手房

news2024/10/5 19:12:48

/    表示两个相邻元素节点关系,也可以说父子关系
用法示例:如果要找上述代码中的 a 标签,路径表达式为:div/a

注意:如果当前查找出来的标签有多个,比如上面查找到的 a 标签有3个,我们想要第2个,写法就是 div/a[2],同理,我们需要第几个标签,就在标签后面加上[顺序值]

//     表示两个不相邻元素节点关系,也可以说爷孙这种隔代关系
用法示例:还是从上述代码中找 a 标签,路径表达式还可以写为:body//a

注意:// 也表示从任意位置开始检索,而不考虑它们的位置。xpath查找标签的顺序正常是从HTML文档头部开始查找,当一个HTML文档中标签非常多,我们查找的标签位于文档的中间某位置。如果直接从头部标签开始一级级往下检索,非常繁琐。用 “// + 标签名” 就相当于从该标签开始检索书写。比如我们还是要找 a 标签,可以写成 //a。

.     指代当前节点,比如xpath路径表达式找到某个元素后,想在此元素基础上往后面查找其他元素,那么前面的路径表达式就可以省略,用 . 替换

@     选取属性,作用就是更精确定位某个标签
用法示例:比如上面我们正常查找的 a 标签是有3个,我们还是要找第2个 a 标签,已经学了一种方法就是 a 标签后面加上[顺序值]。但是如果 a 标签有几十个呢,我们就要一个个数顺序,很繁琐也容易出错。这时候就可以通过标签自身的属性值来精确定位某个标签。我们仔细可以看出上面的每个 a 标签里面的 href 和 title 两个属性值都是彼此不同的,那我们要找第2个,可以这样写://a[@href=“/ershoufang/xicheng/”] 或者 //a[@title="北京西城在售二手房 "]。格式就是:标签名[@属性名=属性值]

text()     提取标签中的文本内容
用法示例:上面的几种方式定位的都是某个标签,如果要拿到标签中的详细内容,比如要拿到第2个 a 标签的文本内容 “西城”这两个字,写法是://a[@title="北京西城在售二手房 "]/text()。格式是:标签/text()

网址信息:

经过点击测试:

“最新发布”的子域名是  co32

下一页的话,子域名是:https://bj.lianjia.com/ershoufang/pg2co32/

                                        https://bj.lianjia.com/ershoufang/pg4co32/

定位需要获取的数据:

代码:

# TODO 爬取链家
import re
import requests
from lxml import etree
import re
basic_url = 'https://bj.lianjia.com/ershoufang/'
domain = 'co32' # 最新发布
for page in range(1, 6):
    print(f"开始输出第{page}页内容:" "+++++++++++++++++++++++++++++++++++")
    new_url = basic_url + "pg" + str(page) + domain
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'}
    response = requests.get(new_url, headers=headers)
    html = etree.HTML(response.text)

    house_info = html.xpath('//div[@class="title"]/a/text()')
    house_price = html.xpath('//div[@class="unitPrice"]//span/text()')
    house_sum_prices = html.xpath('//div[@class="totalPrice totalPrice2"]/span/text()')

    for house_title, price, sum_price in zip(house_info, house_price, house_sum_prices):
        print("房屋信息描述", house_title)
        print("房屋单价:", price)
        print("房屋总价:", sum_price)
        print("-----------------------")

大致逻辑:

1.定义一个基本的url

2.定义最新发布的这个子域名

3.for循环定义翻找的页数,这里就弄了5页

4 在for循环里使用拼接字符串法方式  产生新的url,因为是for循环内,所以相当于依次访问

https://bj.lianjia.com/ershoufang/pg1co32

https://bj.lianjia.com/ershoufang/pg2co32

https://bj.lianjia.com/ershoufang/pg{N}co32

5.etree解析 HTML 内容

6.xpath提取房屋信息

7.使用zip函数迭代多个对象,方便格式化输出相匹配的数据

返回:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1508336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3项目报Parsing error: Cannot find module ‘typescript‘

vue3项目报Parsing error: Cannot find module ‘typescript’ 解决办法,安装typescript,然后一定记得 退出vscode,再重新打开项目即可。 npm install typescript --save-dev

Android中显式Intent和隐式Intent的区别

1、intent的中文名 称是意图,Intent是各个组件之间信息沟通的桥梁, 既能在Activity之间沟通,又能在Activity与Service之间沟通,也能在Activity与Broadcast之间沟通 **intent组成元素的列表说明**2、显式Intent,直接指定…

【MATLAB第98期】基于MATLAB的MonteCarlo蒙特卡罗结合kriging克里金代理模型的全局敏感性分析模型(有目标函数)

【MATLAB第98期】基于MATLAB的Monte Carlo蒙特卡罗结合kriging克里金代理模型的全局敏感性分析模型(有目标函数)【更新中】 PS:因内容涉及较多,所以一时半会更新不完 后期会将相关原理,以及多种功能详细介绍。 麻烦点赞收藏&#…

CMU 10-414/714: Deep Learning Systems --hw0

hw0 宏观上的步骤: softmax loss: 实现softmax loss代码 概念 softmax就是将结果映射到0~1之间,且所有结果相加为1(概率形式)cross-entropy loss就是计算 p ( x ) log ⁡ q ( x ) p(x)\log {q(x)} p(x)logq(x),此值可用于衡量实际输出与期望输出的距离,进而衡量预测模…

分支需求管理方式

此文为上一篇文章的后续 我们来回顾一下,现在,你的小组负责的系统,有主干分支,每次新的需求,你都从主干(formal)拉取分支(dev-日期-需求名)进行修改,自测通过后,合并至测试分支(test)进行提测&a…

【内推】新风口-大模型独角兽公司minimax

先上内推链接: MiniMax社招内推码: AK3XEJ6 投递链接: https://vrfi1sk8a0.jobs.feishu.cn/s/iFY5WFgE 岗位:前端、后端、算法,基础架构都有,大量hc 公司介绍: 国内同时拥有文本、语音、视觉三种基础大模型能力的创业…

不要在代码中随便使用try...catch了

前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 目录 背景 js中的try...catch try...catch运行机制 js的事件循环机制 try...c…

动态代理以及Retrofit的原理

代理模式) 首先什么是代理模式? 代理模式就是通过引入代理对象去帮助真实对象完成一些事情,防止直接访问目标对象给系统带来不必要的复杂性。 代理模式一般分为三个角色: 抽象角色: 指代理对象和真实对象对外提供的…

等保2.0 测评 linux服务器加固 基本安全配置手册

1.删除系统特殊的的用户帐号: 禁止所有默认的被操作系统本身启动的且不需要的帐号,当你第一次装上系统时就应该做此检查,Linux提供了各种帐号,你可能不需要,如果你不需要这个帐号,就移走它,你有的帐号越多,就越容易受到攻击。 #为删除你系统上的用户,用下面的命令:…

Python中的并发编程:多线程与多进程的比较【第124篇—多线程与多进程的比较】

Python中的并发编程:多线程与多进程的比较 在Python编程领域中,处理并发任务是提高程序性能的关键之一。本文将探讨Python中两种常见的并发编程方式:多线程和多进程,并比较它们的优劣之处。通过代码实例和详细的解析,…

【C++庖丁解牛】STL之vector容器的介绍及使用 | vector迭代器的使用 | vector空间增长问题

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1.1 vector的介绍2 v…

【数据结构:树与堆】向上/下调整算法和复杂度的分析、堆排序以及topk问题

文章目录 1.树的概念1.1树的相关概念1.2树的表示 2.二叉树2.1概念2.2特殊二叉树2.3二叉树的存储 3.堆3.1堆的插入(向上调整)3.2堆的删除(向下调整)3.3堆的创建3.3.1使用向上调整3.3.2使用向下调整3.3.3两种建堆方式的比较 3.4堆排…

基于Spring Boot+ Vue的房屋租赁系统

末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…

水电站泄洪闸预警系统技术改造项目方案

一、工期安排 2024年1月10日至1月30日,共20天,水电站泄洪闸预警系统建设项目主要以计划工作任务为依据开展并控制工期。 二、预警系统建设项目 水电站泄洪闸预警系统技术改造项目实施内容主要是在每个确定后的预警广播站点采用基础开挖预制地笼浇筑混凝…

【Python】一文详细介绍 plt.rcParamsDefault 在 Matplotlib 中的原理、作用、注意事项

【Python】一文详细介绍 plt.rcParamsDefault 在 Matplotlib 中的原理、作用、注意事项 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程…

GeoPy1.1 地理数据处理入门

原作者:Damon 高校教师,中科院 GIS 博士 本文为原文章基础上,加上自己以及GPT4.0的总结整理而来 原活动链接 目录 前言小练习:求一周的平均温度小练习:将文件夹下的文件路径都打印出来:小练习&#xff1a…

ManualResetEvent 在线程中的使用C#

ManualResetEvent 用于表示线程同步事件,可以使得线程等待信号发射之后才继续执行下一步,否则一直处于等待状态中。 ManualResetEvent 的常用方法 构造函数ManualResetEvent(bool); ManualResetEvent manualResetEvent new ManualResetEvent(false…

医疗健康机器人_血压血糖血氧中医AI远程医疗定制方案

为人们提供了更加便捷、全面的健康管理服务,开发一款智能医疗健康机器人产品,为用户提供了多项便捷的服务,包括多体征检测、在线问诊、预约挂号、在线购药、健康科普教育等。这些服务构成了从疾病咨询到问诊再到健康管理的闭环,使…

系统学习c++类和对象——深度理解默认成员函数

前言:类和对象是面向对象语言的重要概念。 c身为一门既面向过程,又面向对象的语言。 想要学习c, 首先同样要先了解类和对象。 本节就类和对象的几种构造函数相关内容进行深入的讲解。 目录 类和对象的基本概念 封装 类域和类体 访问限定符…

ICLR 2024 | Meta AI提出ViT寄存器结构,巧妙消除大型ViT中的伪影以提高性能

论文题目:Vision Transformers Need Registers 论文链接:https://arxiv.org/abs/2309.16588 视觉Transformer(ViT)目前已替代CNN成为研究者们首选的视觉表示backbone,尤其是一些基于监督学习或自监督学习预训练的ViT&a…