Как извлечь URL-адрес в гиперссылках из файла docx с помощью python

Я пытался выяснить, как получить URL-адреса из файла docx с помощью python, но ничего не нашел, я пробовал python-docx и python-docx2txt, но python-docx, кажется, только извлекает текст, а python-docx2txt может извлекать текст из гиперссылки, но не сами URL-адреса.


person user2968505    schedule 07.11.2016    source источник
comment
Можете ли вы более конкретно указать, каково ваше более широкое намерение? python-docx имеет возможность гиперссылки, поэтому информация, которую вы ищете, находится там. Вы просто хотите извлечь все гиперссылки в документе или извлечь их вместе с остальным текстом?   -  person scanny    schedule 08.11.2016
comment
@scanny Мне нужны только URL-адреса, текст меня не волнует.   -  person user2968505    schedule 08.11.2016
comment
К сожалению, извините, python-docx пока не поддерживает гиперссылки, это запрос на включение, который, к сожалению, застопорился. Вам нужно будет перейти на уровень lxml/internals, если вы хотите это сделать. Я добавлю несколько идей в ответ.   -  person scanny    schedule 08.11.2016


Ответы (4)


Я новичок в Python, и мне нужно использовать Python для изменения каждой гиперссылки в документе .docx. Благодаря коду Кирана, который дал мне подсказки, чтобы сделать несколько догадок, проб и ошибок и, наконец, заставить его работать. Вот код, который у меня есть, и я хотел бы поделиться с другими новичками.

# python to change docx URL hyperlinks:
### see: https://stackoverflow.com/questions/40475757/how-to-extract-the-url-in-hyperlinks-from-a-docx-file-using-python

from docx import Document
from docx.opc.constants import RELATIONSHIP_TYPE as RT

print(" This program changes the hyperlinks detected in a word .docx file \n")

docx_file=input(" Pls input docx filename (without .docx): ")

document = Document(docx_file + ".docx")

rels = document.part.rels

for rel in rels:
   if rels[rel].reltype == RT.HYPERLINK:
      print("\n Origianl link id -", rel, "with detected URL: ", rels[rel]._target)
      new_url=input(" Pls input new URL: ")
      rels[rel]._target=new_url

out_file=docx_file + "-out.docx"

document.save(out_file)

print("\n File saved to: ", out_file)

Спасибо, Лапью Хо.

person Lapyiu    schedule 11.12.2018

Я решил это, используя следующий код для печати содержимого гиперссылки из docx

from docx import Document
from docx.opc.constants import RELATIONSHIP_TYPE as RT

document = Document('test.docx')
rels = document.part.rels

def iter_hyperlink_rels(rels):
    for rel in rels:
        if rels[rel].reltype == RT.HYPERLINK:
            yield rels[rel]._target      

print(iter_hyperlink_rels(rels)
person Kiran Kumar Kotari    schedule 31.03.2018

def iter_hyperlink_rels(rels):
   for rel in rels:
      if rels[rel].reltype == RT.HYPERLINK:
         yield rels[rel]      

Это устранит ошибку.

person Raj    schedule 28.01.2018
comment
Пожалуйста, отредактируйте свой ответ, чтобы код был правильно отформатирован (используйте Ctrl + K в разделе, который нужно отформатировать). Кроме того, добавленный в сегмент кода, пожалуйста, включите объяснение того, почему это работает, чтобы будущие читатели знали, что делает ответ. - person Sudheesh Singanamalla; 28.01.2018

Я опаздываю на эту вечеринку, но если вам нужно что-то, что извлекает все ссылки из файлов .docx и создает из них электронную таблицу (или возвращает их список), у меня есть скрипт, который может сделать это за вас. Он включает в себя как URL-адрес, так и связанный текст, и вы можете передать ему целую папку, если хотите.

https://github.com/Colin-Fredericks/hx_util/blob/master/hx_util/GetWordLinks.py

Он использует BeautifulSoup и UnicodeCSV, которые вы также можете получить из того же репозитория. Работает на Python3. Инструкция вверху файла. Обрабатывает символы, отличные от ascii. Пока протестировано только на Mac и Ubuntu. Excel не может надежно импортировать CSV-файлы в формате Unicode, в отличие от Google Диска. Предлагайте void() там, где это запрещено.

person Colin Fredericks    schedule 28.03.2018
comment
Ссылка не работает. Не рекомендуется, чтобы ответы слишком сильно зависели от внешних веб-сайтов. - person Jean-Francois T.; 28.01.2021
comment
@Жан-ФрансуаТ. Спасибо за замечание - исправил ссылку. Это файл из 250 строк, поэтому я не уверен, как лучше всего включить сюда код. - person Colin Fredericks; 28.01.2021
comment
Я на самом деле тоже не уверен. Вероятно, вы можете найти ответ в META StackOverflow: meta.stackoverflow.com - person Jean-Francois T.; 29.01.2021