HTML解析是任何网络爬虫应用的基础,Python中提供了多个解析HTML的库,包括BeautifulSoup、lxml、html5lib等。这里我们将使用BeautifulSoup来演示如何解析HTML。
安装BeautifulSoup
在安装BeautifulSoup之前,需要先安装一个Python包管理器pip。在终端中输入以下命令安装pip。
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py sudo python get-pip.py
安装完成pip后,输入以下命令来安装BeautifulSoup。
pip install BeautifulSoup4
解析HTML
我们将使用BeautifulSoup来解析一个简单的HTML文件,其中包含了一个标题和两个链接。我们使用open
函数来打开该文件,读取其中的文本。
from bs4 import BeautifulSoup with open('example.html') as f: soup = BeautifulSoup(f.read(), 'html.parser')
在这个例子中,使用了open
函数来打开名为example.html
的文件,并创建了一个BeautifulSoup对象soup
。html.parser
是一个HTML解析器,它将HTML代码解析成一个树形结构。
读取文件后,我们就可以使用BeautifulSoup的各种方法来遍历和查询HTML文档了。
遍历HTML树形结构
我们可以使用soup
对象中的children
来获取HTML文档中的所有顶级标签。每个标签都是一个Tag类型的对象,包含了标签名、属性和子节点等信息。
for child in soup.children: print(child)
输出:
<html> <head> <title>Example</title> </head> <body> <a href="https://www.google.com">Google</a> <a href="https://www.bing.com">Bing</a> </body> </html>
我们也可以使用soup
对象中的descendants
来遍历HTML文档中的所有标签,包括嵌套的标签。
for tag in soup.descendants: print(tag)
输出:
<html> <head> <title>Example</title> </head> <body> <a href="https://www.google.com">Google</a> Google <a href="https://www.bing.com">Bing</a> Bing </body> </html>
查询HTML文档
我们可以使用soup
对象中的各种方法来查询HTML文档中的标签和内容。
1.查询标签
使用soup.find_all
方法来查询一个HTML文档中所有的标签,该方法返回一个列表。
links = soup.find_all('a') print(links)
输出:
[<a href="https://www.google.com">Google</a>, <a href="https://www.bing.com">Bing</a>]
2.查询属性
如果我们只想查询标签中的某一个属性,可以使用tag.get
方法来获取该属性的值。
for link in links: url = link.get('href') print(url)
输出:
https://www.google.com https://www.bing.com
3.查询文本
使用tag.string
可以获取一个标签中的文本内容。
for link in links: text = link.string print(text)
输出:
Google Bing
修改HTML文档
如果我们需要修改HTML文档中的内容,可以直接修改Tag对象的属性或文本内容。例如:
link = soup.find('a') link['href'] = 'https://www.yahoo.com' link.string = 'Yahoo'
该代码将第一个链接的href
属性修改为https://www.yahoo.com
,并将链接文本修改为Yahoo
。
修改完成后,我们可以使用soup
对象的prettify
方法将修改后的HTML文档格式化输出。该方法将自动缩进和换行,使HTML文档更易于阅读。
html = soup.prettify('utf-8') with open('modified.html', 'wb') as f: f.write(html)
使用以上代码,我们可以将修改后的HTML文档保存