给定HTML字符串: <div class="level_one on"> <ul> <li> <a href=" " title="什么是Java" class="level">什么是Java</a > </li> <li> <a href="javascript:" onclick="login(0)" title="Java的版本">Java的版本</a > </li> <li> <a href="javascript:" onclick="login(0)" title="Java API文档">Java API文档</a > </li> </ul> </div> 实验要求: 1、基于lxml库,定位<li>节点,打印出所有li节点的内容 2、基于lxml库,定位<a>节点,打印出第二个a节点内容 3、基于lxml库,获取class=”level”的所有div节点
时间: 2025-05-26 15:21:42 浏览: 30
### 使用 lxml 库解析 HTML 字符串并完成指定操作
#### 1. 打印所有 `<li>` 节点的内容
为了提取所有的 `<li>` 节点内容,可以利用 XPath 表达式 `//li/text()` 遍历整个文档树中的 `<li>` 元素,并逐一读取它们的文本值。以下是具体的代码实现:
```python
from lxml import etree
html_content = '''
<html>
<body>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</body>
</html>
'''
# 解析 HTML 字符串为 DOM 树
html_tree = etree.HTML(html_content)
# 提取所有<li>节点的文本内容
all_li_texts = html_tree.xpath('//li/text()')
# 打印每个<li>节点的内容
for li_text in all_li_texts:
print(li_text) # 输出: Item 1, Item 2, Item 3
```
此方法通过 XPath 表达式 `//li/text()` 匹配到所有 `<li>` 节点的直接子文本[^3]。
---
#### 2. 打印第二个 `<a>` 节点的内容
针对定位并打印第二个 `<a>` 节点的任务,可使用 XPath 表达式 `//a[2]/text()` 来精确选取第 2 个 `<a>` 元素的文本内容。下面展示其实现方式:
```python
from lxml import etree
html_content = '''
<html>
<body>
<a href="#">Link 1</a>
<a href="#">Link 2</a>
<a href="#">Link 3</a>
</body>
</html>
'''
# 构建 HTML 对象
html_tree = etree.HTML(html_content)
# 获取第二个<a>节点的文本内容
second_a_text = html_tree.xpath('//a[2]/text()')[0]
print(second_a_text) # 输出: Link 2
```
此处使用的表达式 `//a[2]` 是一种索引形式,表示匹配的是按顺序排列的第 2 个 `<a>` 元素[^4]。
---
#### 3. 获取 `class` 为 `'level'` 的所有 `<div>` 节点
当需要筛选具有特定 CSS 类名的元素时,可通过 XPath 的属性过滤功能来达成目的。例如,以下代码实现了对 `class="level"` 的 `<div>` 节点的检索与遍历:
```python
from lxml import etree
html_content = '''
<html>
<body>
<div class="level">Level 1</div>
<div class="other-class">Other Content</div>
<div class="level">Level 2</div>
</body>
</html>
'''
# 创建 HTML 结构实例
html_tree = etree.HTML(html_content)
# 查找所有 class='level' 的 <div> 节点
level_divs = html_tree.xpath("//div[@class='level']")
# 迭代输出找到的每一个<div>节点的文本
for div in level_divs:
print(div.text) # 输出: Level 1 和 Level 2
```
这里的重点在于路径查询条件 `@class='level'`,它限定了只返回那些拥有相应类名称的 `<div>` 元素[^5]。
---
### 总结
上述三个任务分别演示了如何运用 lxml 及其内置的 XPath 功能去高效地分析和抽取 HTML 数据的不同部分。无论是简单的标签还是带复杂属性的选择器都能被灵活应对[^6]。
阅读全文