2013-06-07 2 views
2

Я хочу анализировать файлы разметки для определенных элементов (например, ссылки) и получать значения из этих элементов, и я не могу найти способ для этого, используя пакет python-markdown. Можно ли это сделать с помощью указанного пакета, или мне нужно сделать .md в html, а затем использовать какой-нибудь инструмент, например, красивый суп, чтобы разобрать html, чтобы получить элементы и/или структуру?Элементы parse из markdown

+0

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

ответ

0

вариант python3 является ReParser

pip install ReParser 

пример в его документации (вставить в конце) выведет:

[('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'}), 
('.', {})] 

пример кода:

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]) 
Смежные вопросы