Смешайте Html-латексный парсер в python - PullRequest
0 голосов
/ 01 июля 2019

Я хотел бы проанализировать тексты, которые смешаны с выражениями html и latex (последний указан между [...] или (...)). А именно, вход является выражением вида:

<p>text1 <ul><li> text2 \(x=1\) </li></ul> text2 \[y=0\]</p> text3 <code>z=e</code>

С учетом такого рода ввода я хотел бы перевести тексты: text1, text2, text3, text4, оставив нетронутыми элементы между <code>..., \[...\] или \(...\).

Я думал создать парсер, а именно дерево, которое соответствует прикрепленному изображению для данного ввода.

tree

  • Во-первых, нужно ли мне выполнять всю эту работу?

  • Во-вторых, мне интересно, стоит ли мне кодировать все с нуля или это возможно некоторые библиотеки, такие как HTML-парсер .

1 Ответ

1 голос
/ 01 июля 2019

Одна возможная реализация алгоритма, который я описал в комментариях:

data = '''<p>text1 <ul><li> text2 \(x=1\) </li></ul> text3 \[y=0\]</p> text4 <code>z=e</code>'''

from bs4 import BeautifulSoup
import re

s = re.sub(r'\\\[', r'<bracket1>', data)
s = re.sub(r'\\\]', r'</bracket1>', s)
s = re.sub(r'\\\(', r'<bracket2>', s)
s = re.sub(r'\\\)', r'</bracket2>', s)

soup = BeautifulSoup('<mydata>' + s + '</mydata>', 'html.parser')

for t in soup.select(':not(bracket1):not(bracket2):not(code)'):
    for txt in t.find_all(text=True, recursive=False):
        if txt.strip():
            txt.replace_with("I've changed {}".format(txt))

s = str(soup)
s = re.sub(r'<bracket1>', r'\\[', s)
s = re.sub(r'</bracket1>', r'\\]', s)
s = re.sub(r'<bracket2>', r'\\(', s)
s = re.sub(r'</bracket2>', r'\\)', s)

print('Old data:', data)
print('New data:', ''.join(str(t) for t in BeautifulSoup(s, 'html.parser').mydata.contents))

Отпечатки:

Old data: <p>text1 <ul><li> text2 \(x=1\) </li></ul> text3 \[y=0\]</p> text4 <code>z=e</code>
New data: <p>I've changed text1 <ul><li>I've changed  text2 \(x=1\) </li></ul>I've changed  text3 \[y=0\]</p>I've changed  text4 <code>z=e</code>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...