Mam ciąg:

# H1 tag
h1 content is here

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

Jak widzisz, mam obraz ![](/media/blog/1551266934_21_289.jpg) (tak samo jak ![](mydomain.com/media/blog/1551266934_21_289.jpg))

Kiedy Markdown to staje się: <img src="/media/blog/1551266934_21_289.jpg"/>

Ale chcę wyników, używa innego bazy adresu URL:

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

1
KitKit 28 luty 2019, 10:08

2 odpowiedzi

Najlepsza odpowiedź

Możesz użyć Pythona-Markdown's API przedłużające i opracuj wtyczkę, która zmienia {{ X0}} atrybut wszystkich obrazów.

W tym konkretnym przypadku można zastąpić image_link i image_reference Procesory inline przez podklasę klas ImageInlineProcessor i ReferenceInlineProcessor. Ale nie ma potrzeby zmiany zachowania parsera. Wystarczy modyfikować atrybut {X4}} wszystkich znaczników {X5}}. Byłoby to najłatwiejsze z 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'))

Teraz musisz powiedzieć klasę Markdown o nowym treeprocessor za pomocą podklasy 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)

Wreszcie musisz powiedzieć Markdown, aby użyć nowego rozszerzenia:

from markdown import markdown

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

Istnieje kilka rzeczy, które możesz zrobić, aby poprawić rozszerzenie, które pozostały jako ćwiczenie dla czytelnika:

  1. Dodaj ustawienie konfiguracji do rozszerzenia, aby ustawić adres URL podstawowy, a nie twardego to.
  2. Wykonaj sprawdzanie błędów podczas łączenia podstawy, aby upewnić się, że istniejący adres URL nie ma już podstawy.
  3. Owiń go w pakiet Pythona, aby dystrybuować i dzielić się z innymi.
1
Waylan 28 luty 2019, 15:17

Możesz użyć URLPARPERS, aby uzyskać ścieżkę obrazu i może je zarumienić swoją nazwę hosta

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)
0
Shriyash Warghade 28 luty 2019, 09:58