在处理 Word 文档时,批量提取超链接功能具有广泛的应用价值。当需要从技术文档或产品手册中批量获取 URL 资源时,手动逐条提取不仅效率低下,还容易产生遗漏和错误。为此,本文提出基于 Python 的自动化解决方案,通过解析文档结构精准提取超链接锚文本、对应 URL 以及屏幕提示,为数据分析、SEO 优化等场景提供结构化数据支持。本文将介绍如何使用 Spire.Doc for Python 通过 Python 代码提取 Word 文档中的超链接。
安装 Spire.Doc for Python
本教程需要 Spire.Doc for Python 和 plum-dispatch v1.7.4。您可以通过以下 pip 命令将它们轻松安装到 Windows 中。
pip install Spire.Doc
如果您不确定如何安装,请参考:如何在 Windows 中安装 Spire.Doc for Python
用 Python 提取 Word 文档中的所有超链接
Word 文档中的超链接是域(Field)的一种。在提取超链接时,我们需要先判断文档中的各个文档对象是否为 Field 实例来找出所有域对象,然后通过判断域对象的 Type 属性是否为 FieldType.FieldHyperlink 来找出所有的超链接域。找到所有超链接后,我们可以使用 Field.FieldText 属性获取超链接的锚文本,并使用 Field.Code 属性获取超链接的完整域代码,形式如下:
超链接类型 | 域代码 |
普通超链接 | HYPERLINK "https://www.example.com/example" |
设置屏幕提示的超链接 | HYPERLINK "https://www.example.com/example" \o "屏幕提示" |
我们可以通过解析域代码来获取超链接的地址以及屏幕提示文本,从而实现超链接信息的完整提取。
以下是从 Word 文档中提取所有超链接的操作步骤:
- 创建 Document 对象,调用 Document.LoadFromFile() 方法加载目标 Word 文档。
- 循环遍历文档所有节,通过 Document.Sections.get_Item(index) 获取当前节对象。
- 对每个节循环遍历子对象,通过 Section.Body.ChildObjects.get_Item(index) 获取当前节子对象。
- 若当前节子对象是 Paragraph 类型:
- 循环遍历段落中的子对象,通过 Section.Body.ChildObjects.get_Item(index) 获取当前子对象。
- 若段落子对象是 Field 类型且 Field.Type 为 FieldType.FieldHyperlink,则将该 Field 对象添加至临时集合。
- 对临时集合中每个 Field 对象:
- 通过 Field.FieldText 提取锚文本。
- 通过 Field.Code 属性获取域代码字符串。
- 处理域代码字符串:
- 截取 "HYPERLINK" 后的引号中的字符作为链接地址。
- 检测域代码是否包含 "\o" 参数,若存在则提取后续双引号内容作为屏幕提示。
- 保存提取到的超链接。
完整代码示例:
- Python
from spire.doc import Document, DocumentObjectType, Paragraph, Field, FieldType
# 创建Document对象
doc = Document()
# 加载Word文件
doc.LoadFromFile("Sample.docx")
# 创建列表用于储存超链接对象
hyperlinks = []
# 遍历文档中的节
for i in range(doc.Sections.Count):
section = doc.Sections.get_Item(i)
# 遍历节中的文档对象
for j in range(section.Body.ChildObjects.Count):
sectionObject = section.Body.ChildObjects.get_Item(j)
# 判断当前文档对象是否为Paragraph实例
if sectionObject.DocumentObjectType == DocumentObjectType.Paragraph:
# 遍历段落中的文档对象
for k in range((sectionObject if isinstance(sectionObject, Paragraph) else None).ChildObjects.Count):
para = (sectionObject if isinstance(sectionObject, Paragraph) else None).ChildObjects.get_Item(k)
# 判断当前文档对象是否为Field实例
if para.DocumentObjectType == DocumentObjectType.Field:
field = para if isinstance(para, Field) else None
# 判断对象类型是否为超链接,将超链接对象添加到列表中
if field.Type == FieldType.FieldHyperlink:
hyperlinks.append(field)
# 将所有超链接的锚文本和URL保存到文本文件
with open("output/提取Word文档超链接.txt", "w", encoding="utf-8") as file:
for i, hyperlink in enumerate(hyperlinks):
# 获取超链接的锚文本
anchorText = hyperlink.FieldText
# 获取超链接域代码
hyperlinkCode = hyperlink.Code
# 获取超链接的URL
url = hyperlinkCode.split('"')[1]
# 判断是否存在屏幕提示
if "\\o" in hyperlink.Code:
# 获取屏幕提示
hyperlinkTip = hyperlinkCode.split('\”')[3].strip()
# 将锚文本、URL和屏幕提示写入文本文件
file.write(f"锚文本:{anchorText}\nURL:{url}\n屏幕提示:{hyperlinkTip}\n\n")
else:
# 将锚文本和URL写入文本文件
file.write(f"锚文本:{anchorText}\nURL:{url}\n\n")
# 关闭文档
doc.Close()
申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。