目录
1、方法一:BeautifulSoup库 🍜
1.1 BeautifulSoup安装与导入
BeautifulSoup 是 Python 中用于解析 HTML 和 XML 文档的库,以其灵活强大的选择器和简洁的API广受开发者喜爱。在Python中使用BeautifulSoup进行HTML解析之前,首先需要通过pip安装此库。如果你还没有安装 ,可以通过运行以下命令来进行安装:
pip install beautifulsoup4
同时,由于BeautifulSoup通常与requests库搭配使用来获取网页内容,因此建议也安装requests:
pip install requests
导入这两个库的方式如下:
from bs4 import BeautifulSoup
import requests
1.2 HTML文档解析基础
BeautifulSoup能够将复杂的HTML文档转换为一个复杂的树形结构,每个节点都是Python对象。这使得我们可以轻松地遍历文档、搜索特定部分以及提取所需数据。例如,解析一个简单的HTML字符串:
url = 'https://blog.csdn.net/xyh2004/article/details/139481315'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
}
response = requests.get(url=url,headers=headers)
html_doc = response.text
soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.prettify())
1.3 CSS选择器实战
CSS选择器是一种强大的工具,用于定位和选取HTML中的元素。BeautifulSoup支持大多数CSS选择器。以下是如何使用它们的例子:
# 选取所有的段落元素
paragraphs = soup.select('.htmledit_views p')
for p in paragraphs:
print("选取所有的段落元素:",p.text)
# 选取具有特定类名的元素,默认寻找第一次出现的
title = soup.select_one('.title-article')
print("选取具有特定类名的元素:",title.text)
# 选取具有特定属性的元素
links = soup.select('a[href]')
for link in links:
print('选取具有特定属性的元素:',link['href'])
# 遍历所有的 `<a>` 标签
for link in soup.find_all('a'):
print("遍历所有的 `<a>` 标签",link.get('href'))
1.4 数据提取与清洗技巧
在提取数据后,可能需要进行一些清洗,去除多余的空白字符、标签等。BeautifulSoup提供了直接访问和修改文本的方法:
# 提取并清洗文本内容
story_paragraph = soup.find(class_='aside-box')
clean_text = story_paragraph.get_text(separator=' ', strip=True)
print("提取并清洗文本内容:",clean_text)
# 移除特定标签
for script in soup(['script', 'style']):
script.extract()
# 现在打印文档 ,会发现脚本和样式已被移除
print(soup.prettify())
以上展示了使用BeautifulSoup解析HTML文档的基本方法,包括安装、基础解析、CSS选择器的应用以及数据的提取与清洗技巧。掌握这些技能,你将能够有效地从网页中提取有价值的信息。
2、方法二:lxml库 📄
2.1 lxml简介与安装
lxml 是一个高效且功能丰富的Python库,用于处理XML和HTML文档。它结合了C语言库libxml2和libxslt的强大功能,提供了XPath和XSLT的支持,使得解析和操作XML/HTML数据变得快速且简单。要安装lxml,只需在你的Python环境中运行:
pip install lxml
2.2 XPath语法入门
XPath(XML Path Language)是一种在XML文档中查找信息的语言 ,同样适用于HTML。它允许你通过元素和属性来定位特定的节点。以下是几个基本的XPath表达式示例:
-
•
//title
:选取文档中的所有<title>
元素。 -
•
/html/body/p
:选取根元素下<html>
子元素内的<body>
子元素 ,再选取其内的所有<p>
元素。 -
•
//a[@href]
:选取所有带有href
属性的<a>
元素。 -
•
//div[@class='content']/p[1]
:选取所有class属性为content
的<div>
元素内的第一个<p>
元素。
例如,要选择所有带有 class="content"
的 div
元素 ,可以使用:
from lxml import etree
html = """
<div class="content">
<p>First paragraph.</p>
</div>
<div class="content">
<p>Second paragraph.</p>
</div>
<div class="main">
<p>I am main.</p>
</div>
"""
root = etree.HTML(html)
elements = root.xpath('//div[@class="content"]')
for element in elements:
print(etree.tostring(element))
输出:
b'<div class="content">\n <p>First paragraph.</p>\n</div>\n'
b'<div class="content">\n <p>Second paragraph.</p>\n</div>\n'