Word文書には、多くの場合、外部リソースを参照するためのハイパーリンクが含まれています。しかし、手作業でリンクを探すのは非効率で、見落としのリスクもあります。Pythonを使って自動でリンクを抽出すれば、リンクのインデックス作成や文書管理が容易になります。この記事では、Pythonを使用してWord文書内のハイパーリンクを一括抽出する方法を紹介し、アンカーテキスト(表示テキスト)、URL、およびヒントを取得する手順を解説します。
この記事で使用する方法には、無料のFree Spire.Doc for Pythonライブラリが必要です。インストールはPyPIから可能です:
pip install spire.doc.free
PythonでWord文書内のすべてのハイパーリンクを抽出する
Document
クラスを使用してWord文書を読み込み、処理を行います。Word文書内のハイパーリンクはフィールド(Field) として段落テキストに挿入されるため、文書内の各セクションの子オブジェクトを判別し、すべての段落を取得した後、段落内の子オブジェクトを判別することで、すべてのフィールドを見つけ出し、さらにフィールドの種類を識別することでハイパーリンクフィールドを抽出できます。
ハイパーリンクフィールドを特定した後、Field.FieldText
プロパティを使用してハイパーリンクのアンカーテキストを取得し、Field.Code
プロパティを使用して以下の形式のフィールドコードを取得できます:
- 通常のハイパーリンクのフィールドコード:
HYPERLINK "https://www.example.com/"
- ヒント付きのハイパーリンクのフィールドコード:
HYPERLINK "https://www.example.com/ai" \o "ヒントの内容"
フィールドコードを分割することで、URLやヒントの内容を取得し、完全なハイパーリンク情報を抽出できます。
以下は、Pythonを使用してWord文書内のハイパーリンクを抽出する手順です。
必要なモジュール:Document
、Paragraph
、Field
、FieldType
。
-
Word文書を読み込む:
Document
オブジェクトを作成し、Document.LoadFromFile()
メソッドで対象のファイルを開きます。 -
文書構造を走査する:
- すべてのセクション (
Sections
) を走査します。 - 各セクションの本文 (
Section.Body.ChildObjects
) を走査します。 -
Paragraph
タイプの子オブジェクトを抽出し、それらのParagraph.ChildObjects
をさらに解析します。
- すべてのセクション (
-
ハイパーリンクを抽出する:
-
Field
タイプの段落内オブジェクトを識別し、FieldType
がFieldType.FieldHyperlink
であるかを判定します。 -
FieldText
からアンカーテキストを取得し、Field.Code
からURLとヒントを解析します。
-
- 抽出したハイパーリンク情報を保存する。
コード例
from spire.doc import Document, Paragraph, Field, FieldType
# Documentオブジェクトを作成
doc = Document()
# Wordファイルを読み込む
doc.LoadFromFile("サンプル.docx")
# ハイパーリンク情報を格納するリストを作成
hyperlinks = []
# 文書内のセクションを走査
for i in range(doc.Sections.Count):
# 現在のセクションを取得
section = doc.Sections.get_Item(i)
# セクション内の本文オブジェクトを走査
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)
# 文書を閉じる
doc.Close()
抽出結果
この記事では、Pythonを使用してWord文書内のハイパーリンクを抽出する方法を紹介しました。ハイパーリンクのアンカーテキスト、URL、ヒントを取得することで、文書管理の効率を向上させ、正確性を確保することができます。