整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Python小案例77-解析HTML文档

解析HTML文档,可以使用一些编程语言中的HTML解析库或工具。以下是一些常用的方法:

  1. 使用Python中的BeautifulSoup库:BeautifulSoup是一个功能强大的HTML解析库,可以帮助你从HTML文档中提取数据。你可以使用pip安装BeautifulSoup,然后使用它的解析器来解析HTML文档。
from bs4 import BeautifulSoup

# 读取HTML文档
with open('example.html', 'r') as file:
    html = file.read()

# 创建BeautifulSoup对象
soup = BeautifulSoup(html, 'html.parser')

# 使用BeautifulSoup对象提取数据
# 例如,提取所有的链接
links = soup.find_all('a')
for link in links:
    print(link.get('href'))
  1. 使用JavaScript中的DOM解析器:如果你在浏览器环境中,可以使用JavaScript的DOM解析器来解析HTML文档。你可以使用document对象来访问和操作HTML元素。
// 读取HTML文档
var html = document.documentElement.innerHTML;

// 使用DOM解析器提取数据
// 例如,提取所有的链接
var links = document.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
    console.log(links[i].getAttribute('href'));
}
  1. 使用其他编程语言的HTML解析库:除了Python和JavaScript,还有许多其他编程语言也有自己的HTML解析库,例如Java中的Jsoup、Ruby中的Nokogiri等。你可以根据自己的编程语言选择适合的HTML解析库来解析HTML文档。

无论你选择哪种方法,解析HTML文档的关键是了解HTML的结构和标签,并使用相应的解析器或工具来提取所需的数据。

当你解析HTML文档时,你可能会遇到以下一些常见的任务和技术:

  1. 选择器:使用选择器可以方便地定位和提取HTML文档中的特定元素。例如,你可以使用CSS选择器来选择具有特定类名或ID的元素,或者使用XPath来选择具有特定属性或层次结构的元素。
  2. 提取数据:一旦你定位到了要提取的元素,你可以使用相应的方法或属性来获取元素的文本内容、属性值或其他相关信息。例如,你可以使用getText()方法来获取元素的文本内容,使用getAttribute()方法来获取元素的属性值。
  3. 遍历文档:HTML文档通常是一个树状结构,你可以使用遍历方法来访问和操作文档中的不同元素。例如,你可以使用递归或循环来遍历文档的子元素、父元素或兄弟元素。
  4. 处理嵌套结构:HTML文档中的元素可能会有嵌套的结构,你需要处理这些嵌套关系来正确地提取数据。例如,你可以使用递归方法来处理嵌套的列表、表格或嵌套的div元素。
  5. 处理特殊情况:在解析HTML文档时,可能会遇到一些特殊情况,例如处理动态生成的内容、处理特殊字符或处理错误的HTML结构。你需要根据具体情况选择合适的方法来处理这些特殊情况。

总的来说,解析HTML文档需要一定的HTML知识和编程技巧。你需要了解HTML的结构和标签,选择合适的解析器或工具,使用选择器来定位元素,提取所需的数据,并处理特殊情况。通过不断练习和实践,你将能够更熟练地解析HTML文档并提取所需的数据。

tmlAgilityPack是一个.NET平台下的HTML解析库,它可以将HTML文本转换为DOM文档对象,方便我们对HTML文本进行操作和分析。HtmlAgilityPack支持XPath语法,可以通过XPath表达式来获取DOM节点,同时还提供了一些方便的API,可以实现HTML文本的解析、修改、生成等功能。本文将详细介绍HtmlAgilityPack的使用及使用方法。

一、HtmlAgilityPack的安装

HtmlAgilityPack是一个NuGet包,可以通过Visual Studio的NuGet包管理器来安装。具体步骤如下:

  1. 打开Visual Studio,打开要安装HtmlAgilityPack的项目。
  2. 在“解决方案资源管理器”中右键单击项目,选择“管理NuGet程序包”。
  3. 在“NuGet程序包管理器”中搜索“HtmlAgilityPack”,选择“安装”。
  4. 等待安装完成。

安装完成后,就可以在项目中使用HtmlAgilityPack了。

二、HtmlAgilityPack的使用

  1. 加载HTML文本

使用HtmlAgilityPack解析HTML文本的第一步是将HTML文本加载到一个HtmlDocument对象中。可以通过以下代码来实现:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlText);

其中,htmlText是要解析的HTML文本。LoadHtml方法会将HTML文本解析成一个DOM文档对象,并存储在doc对象中。

  1. 获取DOM节点

HtmlAgilityPack提供了一些方法来获取DOM节点,例如GetElementById、GetElementsByTagName、SelectSingleNode、SelectNodes等。这些方法都接受一个XPath表达式作为参数,用来指定要获取的节点。以下是一些示例代码:

// 获取id为"content"的节点
HtmlNode contentNode = doc.GetElementById("content");

// 获取所有的a标签
HtmlNodeCollection aNodes = doc.DocumentNode.SelectNodes("//a");

// 获取第一个p标签
HtmlNode pNode = doc.DocumentNode.SelectSingleNode("//p");

其中,XPath表达式的语法与XML的XPath语法相同。在这里不再详细介绍。

  1. 修改DOM节点

HtmlAgilityPack提供了一些方法来修改DOM节点,例如SetAttributeValue、InnerHtml、OuterHtml等。以下是一些示例代码:

// 修改id为"content"的节点的class属性
contentNode.SetAttributeValue("class", "new-class");

// 修改第一个p标签的内容
pNode.InnerHtml = "这是新的内容";

// 修改第一个a标签的href属性
HtmlNode aNode = aNodes[0];
aNode.SetAttributeValue("href", "http://www.example.com");
  1. 生成HTML文本

HtmlAgilityPack还可以将DOM文档对象转换为HTML文本。可以通过以下代码来实现:

string newHtmlText = doc.DocumentNode.OuterHtml;

其中,OuterHtml属性返回DOM文档对象的HTML文本表示。

三、HtmlAgilityPack的功能实例

下面将通过一些具体的实例来演示HtmlAgilityPack的使用方法。

  1. 获取页面标题

以下代码演示了如何获取页面标题:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlText);

HtmlNode titleNode = doc.DocumentNode.SelectSingleNode("//title");
string title = titleNode.InnerHtml;

其中,htmlText是要解析的HTML文本。首先,将HTML文本加载到一个HtmlDocument对象中。然后,通过XPath表达式“//title”获取页面标题节点。最后,通过InnerHtml属性获取标题的内容。

  1. 获取页面中的所有图片

以下代码演示了如何获取页面中的所有图片:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlText);

HtmlNodeCollection imgNodes = doc.DocumentNode.SelectNodes("//img");
foreach (HtmlNode imgNode in imgNodes)
{
    string src = imgNode.GetAttributeValue("src", "");
    Console.WriteLine(src);
}

首先,将HTML文本加载到一个HtmlDocument对象中。然后,通过XPath表达式“//img”获取所有图片节点。最后,遍历所有图片节点,获取每个节点的src属性。

  1. 获取页面中的所有链接

以下代码演示了如何获取页面中的所有链接:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlText);

HtmlNodeCollection aNodes = doc.DocumentNode.SelectNodes("//a");
foreach (HtmlNode aNode in aNodes)
{
    string href = aNode.GetAttributeValue("href", "");
    Console.WriteLine(href);
}

首先,将HTML文本加载到一个HtmlDocument对象中。然后,通过XPath表达式“//a”获取所有链接节点。最后,遍历所有链接节点,获取每个节点的href属性。

  1. 修改页面中的所有链接

以下代码演示了如何将页面中的所有链接修改为指定的链接:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlText);

HtmlNodeCollection aNodes = doc.DocumentNode.SelectNodes("//a");
foreach (HtmlNode aNode in aNodes)
{
    aNode.SetAttributeValue("href", "http://www.example.com");
}

string newHtmlText = doc.DocumentNode.OuterHtml;

首先,将HTML文本加载到一个HtmlDocument对象中。然后,通过XPath表达式“//a”获取所有链接节点。最后,遍历所有链接节点,将它们的href属性修改为指定的链接。最后,通过OuterHtml属性将修改后的DOM文档对象转换为HTML文本。

本文介绍了HtmlAgilityPack的使用及使用方法。HtmlAgilityPack是一个功能强大、易用性高的HTML解析库,可以方便地对HTML文本进行操作和分析。通过本文的介绍,读者可以了解HtmlAgilityPack的基本用法,并可以根据需要自行扩展。

我们先前进行网站页面内容解析的过程中,通常选择运用正则表达式来完成此任务。然而,正如前面几篇文章所阐述和分析的那样,无论是正则表达式还是XPath,它们虽各自具备适应不同应用场景的优势,却也都存在着各自难以避免的缺陷。例如,正则表达式具有相对复杂的语法结构并且需要大量的编程知识才能熟练掌握;而XPath虽然使得实现路径查找更为简洁易懂,但却需要编写复杂的节点路径编码。因此,为了充分利用HTML读取技术的强大功能,同时追求更加简明直观的操作体验,本文将向您推荐Beautiful Soup这款强大的三方工具。那么,它是否能够如其名字那般“美丽”呢?接下来,让我们共同揭开这个谜团!

Beautiful Soup 也是一个 Python 的 XML 和 HTML 的解析库,其提供了简单的,Python 式的函数来处理导航,搜索,修改分析树等功能(来自官方介绍)。

Beautiful Soup来源于爱丽丝梦游仙境

开始使用

在使用 Beautiful Soup 之前,需要安装好 lxml(推荐 lxml 解析器) 和其自身的库。

pip install beautifulsoup4
pip install lxml

beautiful Soup 在解析过程中依赖各种解析器,除了支持 Python 标准的解析器外,还支持其他的三方解析器(如: lxml)。

各种解析器优缺点

一般在使用的过程中,推荐使用 lxml,因为 lxml 本身也是一个非常优秀的解析库,也支持 XML 的解析。

假设有以下内容的 html 文档。

<!DOCTYPE html>
<html lang="en">
<body>
  <div>
    <ul>
      <li class="class-0">
        <a href="a.html">
          <span>第一个标签</span>
        </a>
      </li>
    </ul>
  </div>
</body>
</html>
from bs4 import BeautifulSoup

# 初始化BeautifulSoup,并指定lxml为解析器
soup = BeautifulSoup(open("index.html"), 
                     "lxml")
# 获取span标签
print(soup.span)
print(soup.span.string)

# <span>第一个标签</span>
# 第一个标签

如上代码,BeautifulSoup 方法有有两个参数, 第一个参数接受一个 html 文档,第二个参数指定解释器类型,这样就初始化了一个BeautifulSoup 的对象,后续就可以使用这个对象来解析和获取 HTML 中的数据,如上方获取 span, 并获取 span 的内容。

获取 bs 对象有两种方式,一种是直接使用文本字符,另一种是读取文档:

from bs4 import BeautifulSoup

soup = BeautifulSoup(open("index.html"))
soup = BeautifulSoup("<html>data</html>")

元素选择

通过上边的代码示例可以看到,在获取到 bs 对象后,后续直接调用节点名称就可以获取到节点对象,再调用 string 属性就可以获取到节点的文本内容,相较于使用正则表达式或者 XPath 效率是非常高的。

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>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')

# 获取title标签
soup.title
# <title>The Dormouse's story</title>

#获取title标签名字
soup.title.name
# u'title'

#获取title标签文本内容
soup.title.string
# u'The Dormouse's story'

#获取title父标签
soup.title.parent.name
# u'head'

#获取p标签
soup.p
# <p class="title"><b>The Dormouse's story</b></p>

#获取p标签的class属性
soup.p['class']
# u'title'

# 获取a标签
soup.a
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>

# 查找所有的a标签
soup.find_all('a')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

# 查找id为link3的标签
soup.find(id="link3")
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

对象种类

虽然在 Beautiful Soup 中可以将复杂的 HTML 文档转换为树形结构,但是从大体可归纳为以下 4 个对象:

Tag:Tag 对象用于表示 HTML 和 XML 文档中的 tag 标签。

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b
type(tag)
# <class 'bs4.element.Tag'>

tag.name
# u'b'

tag['class']
# u'boldest'

如上任何的标签在Beautiful Soup 都表示为一个 Tag 对象,且从该对象上获取到当前标签的各种属性值。

NavigableString :表示 Tag 中被包裹的字符串

tag.string
# u'Extremely bold'
type(tag.string)
# <class 'bs4.element.NavigableString'>

BeautifulSoup :该对象表示文档整体的一个类,即初始化后获得的类,所以获取到该类,就获取到了整个文档。需要注意需要和上边 Tag 类做出区分,BeautifulSoup 类是特殊的 Tag 类。

Comment :表示文档中的注释内容,其本质也是一个特殊的NavigableString 对象,但由于其特殊性,单独做封装处理。

使用 CSS 选择器选择节点

除了上边的属性选择器和方法选择器外,Beautiful Soup 还提供 CSS 选择器,这对于有前端样式开发经验的同学来说是非常给力的一个特性。通过 CSS 选择器也可以轻松的选定各个节点,但在使用中和上边的有所不同需要调用 .selsect() 方法, 如下方代码:

soup.select("title")
# [<title>The Dormouse's story</title>]

soup.select("p:nth-of-type(3)")
# [<p class="story">...</p>]

有不熟悉css选择器的小伙伴可以在w3c上学习,一般基础的选择器就可胜任绝大多数数据获取的任务。