Python如何提取Word文檔中的超鏈接
前言
在數(shù)字化辦公場景中,Word文檔作為承載結(jié)構(gòu)化信息的重要載體,常包含大量嵌入的超鏈接以關(guān)聯(lián)外部資源或?qū)崿F(xiàn)內(nèi)容交互。這些鏈接可能隱含著關(guān)鍵參考數(shù)據(jù)、云端資源定位或動態(tài)更新的數(shù)據(jù)源接口,但人工逐條檢索不僅效率低下且易出現(xiàn)遺漏。自動化提取技術(shù)不僅能快速建立鏈接索引,還能分析鏈接分布特征,支撐鏈接有效性驗證、文檔版本監(jiān)控等場景,顯著降低人工操作風險,確保信息管理的完整性與可追溯性。本文將介紹如何使用Python實現(xiàn)Word文檔中超鏈接的批量提取,包括超鏈接錨文本、URL以及屏幕提示文本的提取。
本文所使用的方法需要用到免費的Free Spire.Doc for Python,PyPI:pip install spire.doc.free。
用Python提取Word文檔中的所有超鏈接
我們可以使用庫中的 Document 類來載入Word文檔進行處理。由于Word文檔中的超鏈接是以域(Field)的形式添加到段落文本中的,因此,我們可以通過判斷文檔各節(jié)子對象類型來找出所有段落,然后再判斷段落子對象類型來找出所有域,最后判斷域類型來找出所有超鏈接域。找出超鏈接域之后,我們可以使用 Field.FieldText 屬性獲取超鏈接的錨文本,以及 Field.Code 屬性獲取以下格式的域代碼:
- 普通超鏈接域代碼:HYPERLINK "https://www.example.com/"
- 帶屏幕提示的超鏈接域代碼:HYPERLINK "https://www.example.com/ai" \o "屏幕提示內(nèi)容"
通過剪切域代碼,我們可以獲取超鏈接的地址的屏幕提示內(nèi)容,從而提取完整的超鏈接信息。
以下是使用Python提取Word文檔超鏈接的操作步驟:
所需模塊:Document、Paragraph、Field、FieldType。
1.加載 Word 文檔:創(chuàng)建 Document 對象并使用 Document.LoadFromFile() 方法加載目標文件。
2.遍歷文檔結(jié)構(gòu):
- 遍歷所有節(jié) Sections。
- 遍歷每個節(jié)的主體子對象 Section.Body.ChildObjects。
- 篩選出段落 Paragraph 類型的子對象,再遍歷段落中的對象 Paragraph.ChildObjects。
3.提取超鏈接:
- 識別 Field 類型的段落子對象,同時確定子對象的 FieldType 屬性是否為 FieldType.FieldHyperlink。
- 解析 FieldText(錨文本)和 Field.Code(URL 及屏幕提示)。
4.保存提取的超鏈接信息。
代碼示例
from spire.doc import Document, Paragraph, Field, FieldType
# 創(chuàng)建Document對象
doc = Document()
# 加載Word文件
doc.LoadFromFile("示例.docx")
# 創(chuàng)建字符串列表用于儲存超鏈接信息
hyperlinks = []
# 遍歷文檔中的節(jié)
for i in range(doc.Sections.Count):
# 獲取當前節(jié)
section = doc.Sections.get_Item(i)
# 遍歷節(jié)中的主體子對象
for j in range(section.Body.ChildObjects.Count):
# 獲取當前子對象
secObj = section.Body.ChildObjects.get_Item(j)
# 判斷子對象是否為段落
if isinstance(secObj, Paragraph):
# 遍歷段落中的子對象
for k in range(secObj.ChildObjects.Count):
# 獲取當前子對象
paraObj = secObj.ChildObjects.get_Item(k)
# 判斷子對象是否為域以及是否為超鏈接域
if isinstance(paraObj, Field) and paraObj.Type == FieldType.FieldHyperlink:
# 獲取超鏈接的錨文本
anchorText = paraObj.FieldText
# 獲取超鏈接的URL
url = paraObj.Code.split('"')[1]
# 判斷是否存在屏幕提示
if "\\o" in paraObj.Code:
# 獲取屏幕提示
hyperlinkTip = paraObj.Code.split('\"')[3].strip()
# 將錨文本、URL和屏幕提示組合到字符串中
hyperlinks.append(f"錨文本:{anchorText}\nURL:{url}\n屏幕提示:{hyperlinkTip}\n\n")
else:
# 將錨文本和URL組合到字符串中
hyperlinks.append(f"錨文本:{anchorText}\nURL:{url}\n\n")
# 將超鏈接信息寫入文件
with open("output/提取的超鏈接.txt", "w", encoding="utf-8") as file:
for hyperlink in hyperlinks:
file.write(hyperlink)
# 關(guān)閉文檔
doc.Close()
提取結(jié)果

方法補充
Python提取docx中的超鏈接
Python如何解析 <w:t></w:t>中間的內(nèi)容
用 xml + 正則表達式如果僅僅使用 for paragraph in document.paragraphs 獲取不包含表格的段落時,還應加上.text屬性
import re
from docx import Document
def get_paragraph_from_docx(file_name):
"""
網(wǎng)址:https:blog.csdn.net,這是一段有hyperlink的段落
這是一段沒有hyperlink的段落
可用于處理包含超鏈接的文本,但會自動跳過表格
:param file_name:
:return:
"""
text = []
document = Document(file_name)
for paragraph in document.paragraphs:
t_para = u""
# 有無超鏈接均可處理
xml_str = str(paragraph.paragraph_format.element.xml)
wt_list = re.findall('<w:t[\S\s]*?</w:t>', xml_str)
for wt in wt_list:
wt_content = re.sub('<[\S\s]*?>', u"", wt)
t_para += wt_content
if t_para:
t_para = t_para.strip()
t_para = re.sub('[\s]', '', t_para)
if t_para:
text.append(t_para)
return text
d = docx.Document(./test.docx)
for p in d.paragraphs:
xml = p.paragraph_format.element.xml
xml_str = str(xml)
wt_list = re.findall('<w:t[\S\s]*?</w:t>', xml_str)
hyperlink = u''
for wt in wt_list:
wt_content = re.sub('<[\S\s]*?>', u'', wt)
hyperlink += wt_content
print(hyperlink)
到此這篇關(guān)于Python如何提取Word文檔中的超鏈接的文章就介紹到這了,更多相關(guān)Python提取Word超鏈接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
工程師必須了解的LRU緩存淘汰算法以及python實現(xiàn)過程
這篇文章主要介紹了工程師必須了解的LRU緩存淘汰算法以及python實現(xiàn)過程,幫助大家更好的學習算法數(shù)據(jù)結(jié)構(gòu),感興趣的朋友可以了解下2020-10-10
python3操作redis實現(xiàn)List列表實例
本文主要介紹了python3操作redis實現(xiàn)List列表實例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
Django中使用ModelForm生成HTML標簽的方法步驟
在 Django 中,使用 ModelForm 來生成 HTML 表單標簽是一種常見且高效的做法,本文主要介紹了Django中使用ModelForm生成HTML標簽的方法步驟,感興趣的可以了解一下2024-01-01

