2013-06-07 1 views
2

Je veux analyser les fichiers markdown pour des éléments spécifiques (tels que des liens) et extraire des valeurs de ces éléments, et je n'arrive pas à trouver un moyen d'utiliser le paquetage python-markdown. Est-il possible de le faire en utilisant ce paquet, ou devrais-je rendre .md en html et ensuite utiliser un outil comme beautiful-soup pour analyser le html pour obtenir des éléments et/ou de la structure?Analyse des éléments en dehors de la démarque

+0

python 3 https://pypi.python.org/pypi/ReParser/1.4 – n611x007

Répondre

0

une option python3 est ReParser

pip install ReParser 

l'exemple dans ses docs (collé à la fin) génèrerait:

[('Hello ', {}), 
('bold', {'is_bold': True}), 
(' world!', {}), 
('\n', {'segment_type': 'LINE_BREAK'}), 
('You can ', {}), 
('try ', {'is_bold': True}), 
('this', {'is_bold': True, 'is_italic': True}), 
(' awesome', {'is_bold': True}), 
(' ', {}), 
('link', {'link_target': 'http://www.eff.org'}), 
('.', {})] 

l'exemple de code est:

import re 
from pprint import pprint 
from reparser import Parser, Token, MatchGroup 

boundary_chars = r'\s`!()\[\]{{}};:\'".,<>?«»“”‘’*_~=' 
b_left = r'(?:(?<=[' + boundary_chars + r'])|(?<=^))' # Lookbehind 
b_right = r'(?:(?=[' + boundary_chars + r'])|(?=$))' # Lookahead 

markdown_start = b_left + r'(?<!\\){tag}(?!\s)(?!{tag})' 
markdown_end = r'(?<!{tag})(?<!\s)(?<!\\){tag}' + b_right 
markdown_link = r'(?<!\\)\[(?P<link>.+?)\]\((?P<url>.+?)\)' 
newline = r'\n|\r\n' 

url_proto_regex = re.compile(r'(?i)^[a-z][\w-]+:/{1,3}') 

def markdown(tag): 
    """Return sequence of start and end regex patterns for simple Markdown tag""" 
    return (markdown_start.format(tag=tag), markdown_end.format(tag=tag)) 

def url_complete(url): 
    """If URL doesn't start with protocol, prepend it with http://""" 
    return url if url_proto_regex.search(url) else 'http://' + url 

tokens = [ 
    Token('bi1', *markdown(r'\*\*\*'), is_bold=True, is_italic=True), 
    Token('bi2', *markdown(r'___'), is_bold=True, is_italic=True), 
    Token('b1', *markdown(r'\*\*'), is_bold=True), 
    Token('b2', *markdown(r'__'),  is_bold=True), 
    Token('i1', *markdown(r'\*'),  is_italic=True), 
    Token('i2', *markdown(r'_'),  is_italic=True), 
    Token('pre3', *markdown(r'```'), skip=True), 
    Token('pre2', *markdown(r'``'),  skip=True), 
    Token('pre1', *markdown(r'`'),  skip=True), 
    Token('s', *markdown(r'~~'),  is_strikethrough=True), 
    Token('u', *markdown(r'=='),  is_underline=True), 
    Token('link', markdown_link, text=MatchGroup('link'), 
      link_target=MatchGroup('url', func=url_complete)), 
    Token('br', newline, text='\n', segment_type="LINE_BREAK") 
] 

parser = Parser(tokens) 
text = ('Hello **bold** world!\n' 
     'You can **try *this* awesome** [link](www.eff.org).') 

segments = parser.parse(text) 
pprint([(segment.text, segment.params) for segment in segments]) 
Questions connexes