Python如何提取Word文檔中的超鏈接
前言
在數(shù)字化辦公場(chǎng)景中,Word文檔作為承載結(jié)構(gòu)化信息的重要載體,常包含大量嵌入的超鏈接以關(guān)聯(lián)外部資源或?qū)崿F(xiàn)內(nèi)容交互。這些鏈接可能隱含著關(guān)鍵參考數(shù)據(jù)、云端資源定位或動(dòng)態(tài)更新的數(shù)據(jù)源接口,但人工逐條檢索不僅效率低下且易出現(xiàn)遺漏。自動(dòng)化提取技術(shù)不僅能快速建立鏈接索引,還能分析鏈接分布特征,支撐鏈接有效性驗(yàn)證、文檔版本監(jiān)控等場(chǎng)景,顯著降低人工操作風(fēng)險(xiǎn),確保信息管理的完整性與可追溯性。本文將介紹如何使用Python實(shí)現(xiàn)Word文檔中超鏈接的批量提取,包括超鏈接錨文本、URL以及屏幕提示文本的提取。
本文所使用的方法需要用到免費(fèi)的Free Spire.Doc for Python,PyPI:pip install spire.doc.free。
用Python提取Word文檔中的所有超鏈接
我們可以使用庫(kù)中的 Document 類來載入Word文檔進(jìn)行處理。由于Word文檔中的超鏈接是以域(Field)的形式添加到段落文本中的,因此,我們可以通過判斷文檔各節(jié)子對(duì)象類型來找出所有段落,然后再判斷段落子對(duì)象類型來找出所有域,最后判斷域類型來找出所有超鏈接域。找出超鏈接域之后,我們可以使用 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 對(duì)象并使用 Document.LoadFromFile() 方法加載目標(biāo)文件。
2.遍歷文檔結(jié)構(gòu):
- 遍歷所有節(jié) Sections。
- 遍歷每個(gè)節(jié)的主體子對(duì)象 Section.Body.ChildObjects。
- 篩選出段落 Paragraph 類型的子對(duì)象,再遍歷段落中的對(duì)象 Paragraph.ChildObjects。
3.提取超鏈接:
- 識(shí)別 Field 類型的段落子對(duì)象,同時(shí)確定子對(duì)象的 FieldType 屬性是否為 FieldType.FieldHyperlink。
- 解析 FieldText(錨文本)和 Field.Code(URL 及屏幕提示)。
4.保存提取的超鏈接信息。
代碼示例
from spire.doc import Document, Paragraph, Field, FieldType # 創(chuàng)建Document對(duì)象 doc = Document() # 加載Word文件 doc.LoadFromFile("示例.docx") # 創(chuàng)建字符串列表用于儲(chǔ)存超鏈接信息 hyperlinks = [] # 遍歷文檔中的節(jié) for i in range(doc.Sections.Count): # 獲取當(dāng)前節(jié) section = doc.Sections.get_Item(i) # 遍歷節(jié)中的主體子對(duì)象 for j in range(section.Body.ChildObjects.Count): # 獲取當(dāng)前子對(duì)象 secObj = section.Body.ChildObjects.get_Item(j) # 判斷子對(duì)象是否為段落 if isinstance(secObj, Paragraph): # 遍歷段落中的子對(duì)象 for k in range(secObj.ChildObjects.Count): # 獲取當(dāng)前子對(duì)象 paraObj = secObj.ChildObjects.get_Item(k) # 判斷子對(duì)象是否為域以及是否為超鏈接域 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é)果
方法補(bǔ)充
Python提取docx中的超鏈接
Python如何解析 <w:t></w:t>中間的內(nèi)容
用 xml + 正則表達(dá)式如果僅僅使用 for paragraph in document.paragraphs 獲取不包含表格的段落時(shí),還應(yīng)加上.text屬性
import re from docx import Document def get_paragraph_from_docx(file_name): """ 網(wǎng)址:https:blog.csdn.net,這是一段有hyperlink的段落 這是一段沒有hyperlink的段落 可用于處理包含超鏈接的文本,但會(huì)自動(dòng)跳過表格 :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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用wxpy實(shí)現(xiàn)自動(dòng)發(fā)送微信消息功能
這篇文章主要介紹了使用wxpy實(shí)現(xiàn)自動(dòng)發(fā)送微信消息功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02工程師必須了解的LRU緩存淘汰算法以及python實(shí)現(xiàn)過程
這篇文章主要介紹了工程師必須了解的LRU緩存淘汰算法以及python實(shí)現(xiàn)過程,幫助大家更好的學(xué)習(xí)算法數(shù)據(jù)結(jié)構(gòu),感興趣的朋友可以了解下2020-10-10Python中利用sqrt()方法進(jìn)行平方根計(jì)算的教程
這篇文章主要介紹了Python中利用sqrt()方法進(jìn)行平方根計(jì)算的教程,是Python學(xué)習(xí)的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05Python Coroutine池化的實(shí)現(xiàn)詳解
在當(dāng)今計(jì)算機(jī)科學(xué)和軟件工程的領(lǐng)域中,池化技術(shù)如線程池、連接池和對(duì)象池等已經(jīng)成為優(yōu)化資源利用率和提高軟件性能的重要工具,所以下面我們就來看看Coroutine池化的具體實(shí)現(xiàn)吧2024-01-01python3操作redis實(shí)現(xiàn)List列表實(shí)例
本文主要介紹了python3操作redis實(shí)現(xiàn)List列表實(shí)例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Django中使用ModelForm生成HTML標(biāo)簽的方法步驟
在 Django 中,使用 ModelForm 來生成 HTML 表單標(biāo)簽是一種常見且高效的做法,本文主要介紹了Django中使用ModelForm生成HTML標(biāo)簽的方法步驟,感興趣的可以了解一下2024-01-01