【Java】爬虫基础 -- XPath 小案例

这篇博客介绍了XPath在XML文档中的基本概念和语法,包括父、子、同胞和后代关系,以及谓语、通配符和选取多个路径的用法。通过实例代码展示了如何在Java中使用XPath解析XML,提供了针对现代浏览器和IE的处理方法,并指导了如何运行程序查看结果。

XPath 是一门在 XML 文档中查找信息的语言。

基础信息


在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点,节点之间的关系有以下几种:
  • 父(Parent):每个元素以及属性都有一个父
  • 子(Children):元素节点可有零个、一个或多个子
  • 同胞(Sibling):拥有相同的父的节点
  • 先辈(Ancestor):某节点的父、父的父,等等。
  • 后代(Descendant):某个节点的子,子的子,等等

XPath语法:

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径 (path) 或者步 (steps) 来选取的,以下面books.xml为例,描述xpath语法。

<?xml version="1.0" encoding="UTF-8"?>  
<bookstore>  
<book>  
  <title lang="eng">Harry Potter</title>  
  <price>29.99</price>  
</book>  
<book>  
  <title lang="eng">Learning XML</title>  
  <price>39.95</price>  
</book>  
</bookstore>  
  1. 选取节点:XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式,右边两列列出了一些路径表达式以及表达式的结果
    在这里插入图片描述

  2. 谓语(Predicates):谓语用来查找某个特定的节点或者包含某个指定的值的节点,谓语被嵌在方括号中。


    在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
    在这里插入图片描述

  3. 选取未知节点:XPath 通配符可用来选取未知的 XML 元素
    在这里插入图片描述

  4. 选取若干路径:通过在路径表达式中使用"|"运算符,可以选取若干个路径。在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果
    在这里插入图片描述

实例代码

  1. 新建一个python项目

  2. 在项目下新建books.xml 文件,作为等会处理的文件

    <?xml version=
### 关于 Crawler-Java 爬虫框架的软件体系结构案例分析 #### 软件架构概述 Crawler-Java 是一种基于 Java爬虫框架,其设计目标是为了简化网络数据采集的过程。类似于 Scrapy 这样的 Python 框架[^1],Crawler-Java 提供了一套完整的工具链来帮助开发者构建高效的爬虫程序。 该框架通常采用分层架构模式,主要分为以下几个部分: 1. **控制层 (Controller Layer)** 控制层负责管理整个爬虫的任务调度和状态监控。通过定义任务队列和优先级机制,可以灵活调整爬取策略。这一层次的设计灵感来源于 Twisted 中的事件驱动模型,使得多线程并发处理成为可能。 2. **解析层 (Parsing Layer)** 解析层专注于从 HTML 或 XML 文档中提取所需的数据。此阶段会利用正则表达式、XPath 和 CSS Selectors 来定位页面中的特定节点并获取相关内容。对于复杂网站,还可以集成第三方库(如 Jsoup)以增强 DOM 处理能力。 3. **持久化层 (Persistence Layer)** 数据存储是任何爬虫项目不可或缺的一部分。在 Crawler-Java 中,可以选择将抓取到的信息保存至关系型数据库(例如 MySQL),或者 NoSQL 数据库(MongoDB)。此外,某些场景下还需要考虑文件系统的写入操作以便长期存档[^2]。 4. **扩展接口 (Extension Interfaces)** 为了提高灵活性,许多现代爬虫框架都提供了丰富的插件支持。这些插件可用于实现自定义的功能需求,比如代理池配置、验证码识别服务调用等。这种模块化的理念有助于降低耦合度,并促进代码重用率提升。 #### 技术选型与实践建议 当选用 Crawler-Java 构建实际应用时,应综合考量业务特性及团队技术水平做出合理决策。以下是几点具体指导原则: - 如果项目涉及大规模分布式部署,则需额外关注通信协议的选择及其安全性保障措施; - 针对动态加载的内容(AJAX 请求返回的结果),可借助 Selenium WebDriver 实现模拟浏览器行为的效果; - 对性能敏感的应用场合务必优化内存占用情况并通过日志记录排查潜在瓶颈所在位置。 ```java // 示例:简单的 URL 访问逻辑 HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://example.com")) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body()); ``` 上述片段展示了如何运用标准 API 发起 HTTP GET 请求并读取响应体内容。尽管这段代码并不属于某个具体的爬虫框架范畴之内,但它很好地诠释了基础组件的工作原理。 --- #### 总结 综上所述,Crawler-Java 的整体架构体现了清晰的责任划分以及高度的可维护性特点。无论是初学者还是资深工程师都能从中受益匪浅。当然,在正式投入生产环境之前还需经过充分测试验证各个环节的表现是否满足预期要求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值