Уценка Python: как я могу настроить базовый URL для медиа, когда строка уценки в HTML - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть строка:

# H1 tag
h1 content is here

![](/media/blog/1551266934_21_289.jpg)

Как видите, у меня есть изображение ![](/media/blog/1551266934_21_289.jpg) (тоже самое, что ![](mydomain.com/media/blog/1551266934_21_289.jpg))

Когда оно уценено, оно становится: <img src="/media/blog/1551266934_21_289.jpg"/>

Но я хочу, чтобы результат использовал другой базовый URL:

<img src="https://media.mydomain.com/media/blog/1551266934_21_289.jpg"/>

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вы можете использовать Python-Markdown Extension API и разработать плагин, который изменяет атрибут src всех изображений.

В этом конкретном случае вы можете переопределить встроенные процессоры image_link и image_reference, создав подклассы классов ImageInlineProcessor и ReferenceInlineProcessor.Но нет необходимости изменять поведение парсера.Вам нужно только изменить атрибут src всех тегов img.Это было бы проще всего с TreeProcessor .

from markdown.treeprocessors import Treeprocessor
from urllib.parse import urljoin

BASE = 'https://media.mydomain.com/'

class ImgBaseTreeprocessor(Treeprocessor):
    def run(self, root):
        # Loop through all img elements
        for img in root.getiterator('img'):
            # Join base to the src URL
            img.set('src', urljoin(BASE, img.get('src'))

Теперь вам нужно рассказать классу Markdown о вашем новом Treeprocessor с подклассом Extension:

from markdown.extensions import Extension

class ImgBase(Extension):
    def extendMarkdown(self, md, md_globals):
        # register the new treeprocessor with priority 15 (run after 'inline')
        md.treeprocessors.register(ImgBaseTreeprocessor(md), 'imgbase', 15)

Наконец, вы должны указать Markdown использовать ваше новое расширение:

from markdown import markdown

html = markdown(text, extensions=[ImgBase()])

Есть несколько вещей, которые вы можете сделать для улучшения расширения, которые оставлены в качестве упражнения для читателя:

  1. Добавьте параметр конфигурации к расширению, чтобы задать базовый URL-адрес, а не жестко его кодировать.
  2. Выполните некоторую проверку ошибок при присоединении к базе, чтобы убедиться, что существующий URL-адрес не работает.У вас уже нет базы.
  3. Оберните ее в пакет Python для распространения и обмена с другими.
0 голосов
/ 28 февраля 2019

Вы можете использовать urlparse, чтобы получить путь к изображению и объединить его с вашим HOSTNAME

from urlparse import urlparse
from bs4 import BeautifulSoup

HOSTNAME="https://media.mydomain.com/"

soup = BeautifulSoup(html_str)
for img in soup.findAll('img'):
    urlInfo = urlparse(img['src'])
    img['src'] = HOSTNAME + urlInfo.path
html_str = str(soup)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...