首页 > 编程知识 正文

Python提取HTML中特定数据

时间:2023-11-19 07:24:56 阅读:288704 作者:USHL

本文将从多个方面详细阐述Python如何提取HTML中特定数据,包括基本概念、库的使用、XPath语法等。相信读完本文后,你可以掌握如何使用Python提取HTML中的数据。

一、基本概念

在Python中,我们可以使用一些开源库来提取HTML中特定的数据。其中最常用的库为BeautifulSoup和lxml库。BeautifulSoup是一个Python库,可以从HTML或XML文件中提取数据。它能够解析不良标记的文档,并且具有错误容纳能力,能够去除文档中的冗余标记。lxml库则是高效且易于使用的Python XML和HTML处理库,可以解析HTML文件并提取其中的数据。

二、库的使用

1. BeautifulSoup库

首先要使用这个库,需要先进行安装。使用命令行进行安装:

!pip install beautifulsoup4

安装完成后,导入库并打开一个 HTML 文件:

from bs4 import BeautifulSoup

html_doc = """
<html><head>
<title>The Dormouse's story</title>
</head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
</body>
</html>
"""

soup = BeautifulSoup(html_doc, 'html.parser')

上述代码摘自 Beautiful Soup 官方文档,第三行代码是指定了使用 ‘html.parser’ 解析器来解析字符串。在实际使用时,解析 web 页面以及解析本地文件可以使用不同的解析器。

接下来就可以从网页中提取数据了。其中最常用的几个函数有 find() 和 find_all()。这两个函数可以帮助我们从 HTML 文件中提取标签。

# 提取第一个 

标签 soup.find('p') # 提取所有的

标签 soup.find_all('p')

我们还可以通过指定标签的属性和值来进一步筛选要提取的标签。

soup.find_all('a', class_='sister')
soup.find_all('a', id='link1')
soup.find_all('a', href=re.compile(r"^http://example.com/"))

此外,还有其他一些函数可以帮助我们从 HTML 中提取数据,如 get_text() 函数,可以用来提取每个标签内的文本内容。

soup.find('p').get_text()
soup.get_text()

2. lxml库

lxml 库使用和 BeautifulSoup 相似,同样需要先进行安装。使用命令行进行安装:

!pip install lxml

安装完成后,导入库并打开一个HTML文件:

from lxml import etree

html_doc = """
<html><head>
<title>The Dormouse's story</title>
</head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
</body>
</html>
"""

html = etree.HTML(html_doc)

上述代码创建了一个 HTML 对象,可以通过 XPath 表达式来查询数据。XPath 是一种在 XML 文档中查找信息的语言。在使用 lxml 库时,需要用到 XPath。

# 查询所有的 

标签 html.xpath('//p') # 查询第一个

标签 html.xpath('//p')[0] # 查询所有带有 class='title' 的

标签 html.xpath('//p[@class="title"]') # 查询所有的 标签中 href 属性以 "http://example.com/" 开头的标签 html.xpath('//a[starts-with(@href, "http://example.com/")]')

三、XPath语法

在使用 lxml 库时,需要用到 XPath,下面介绍一些常用的 XPath 语法。

1. 基本语法

模式 含义
tagname 选取此节点的所有子节点
tagname/tagname 选取此节点的所有子孙节点
* 匹配任何元素节点
@attribute 选取属性

2. 谓语

谓语可以对选择的元素进行进一步筛选,可以指定位置、属性等。

模式 含义
tagname[position] 选取 tagname 标签中指定位置的元素
tagname[@attribute] 选取 tagname 标签中指定属性的元素
tagname[@attribute='value'] 选取 tagname 标签中指定属性并且属性值为 value 的元素

3. 运算符

XPath 中的运算符包括比较运算符、逻辑运算符和数值运算符。下表中只列出了常用的运算符。

运算符 描述
= 等于
!= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于
and 逻辑与
or 逻辑或
+ 加法
- 减法
* 乘法
div 除法

四、Python提取HTML中特定数据的常见问题

1. 如何处理 HTML 文件中的注释?

在 Beautiful Soup 中,注释被处理为 Comment 对象,可以使用 issubclass() 函数判断一个元素是否为 Comment 对象。

from bs4 import Comment

for element in soup.find_all(text=lambda text: isinstance(text, Comment)):
    print(element)

在 lxml 中,可以使用 XPath 表达式 "//comment()" 来选取所有的注释。

html.xpath('//comment()')

2. 如何处理 HTML 文件中的特殊字符?

在 Beautiful Soup 和 lxml 中,特殊字符会默认转换为 Unicode 字符。如果需要转换为 HTML 实体,可以使用 Python 的 html 模块。

import html

html.escape('<spam>')

3. 如何处理 HTML 文件中的缺失标签?

在 lxml 库中,可以使用补全功能来处理缺失标签。

from lxml.html.clean import Cleaner

cleaner = Cleaner()
cleaner.scripts = True
cleaner.javascript = True
cleaner.comments = True
cleaner.style = True
cleaner.inline_style = True

cleaned_html = cleaner.clean_html(html_doc)

html = etree.HTML(cleaned_html)

上述代码摘自 lxml 官方文档,它使用了 lxml.html.clean 模块的 Cleaner 类来补全缺失标签。

总结

本文详细阐述了 Python 提取 HTML 中特定数据的方法,包括两个常用库的使用和 XPath 语法。同时介绍了一些常见问题的解决方法。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。