#python #html #latex #pandoc #pypandoc
#python #HTML #Латекс #pandoc #pypandoc
Вопрос:
я пытался преобразовать строку HTML question_text_html (которая представляет собой математический вопрос, написанный на HTML) в приведенном ниже коде в строку latex, используя pypandoc. но он продолжает включать нерелевантные строки, такие как » protect hypertarget{MJX- …} …..» в преобразованную строку
import pypandoc
from selenium import webdriver
driver.get("https://nigerianscholars.com/past-questions/mathematics/?
show_answers=yes")
question_blocks=driver.find_elements_by_class_name('question_block')
for question_block in question_blocks:
question_text=question_block.find_element_by_class_name('question_text')
question_text_html=question_text.get_attribute('innerHTML')
question_latex=pypandoc.convert_text(question_text_html,'tex',format='html')
print(f'Question Html is {question_text_html}')
print(f'Question latex is {question_latex}')
обычно это дает
Question Html is <html><body><p class="q_question">Differentiate <span class="MathJax_Preview" style="color: inherit;"></span><span class="mjx-chtml MathJax_CHTML" data-mathml='amp;<math xmlns="http://www.w3.org/1998/Math/MathML"amp;>amp;<mo stretchy="false"amp;>(amp;</moamp;>amp;<mnamp;>2amp;</mnamp;>amp;<miamp;>xamp;</miamp;>amp;<moamp;> amp;</moamp;>amp;<mnamp;>5amp;</mnamp;>amp;<msupamp;>amp;<mo stretchy="false"amp;>)amp;</moamp;>amp;<mnamp;>2amp;</mnamp;>amp;</msupamp;>amp;<mo stretchy="false"amp;>(amp;</moamp;>amp;<miamp;>xamp;</miamp;>amp;<moamp;>amp;amp;#x2212;amp;</moamp;>amp;<mnamp;>4amp;</mnamp;>amp;<mo stretchy="false"amp;>)amp;</moamp;>amp;</mathamp;>' id="MathJax-Element-1-Frame" role="presentation" style="font-size: 114%; position: relative;" tabindex="0"><span aria-hidden="true" class="mjx-math" id="MJXc-Node-1"><span class="mjx-mrow" id="MJXc-Node-2"><span class="mjx-mo" id="MJXc-Node-3"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.485em; padding-bottom: 0.572em;">(</span></span><span class="mjx-mn" id="MJXc-Node-4"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.397em; padding-bottom: 0.353em;">2</span></span><span class="mjx-mi" id="MJXc-Node-5"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.221em; padding-bottom: 0.309em;">x</span></span><span class="mjx-mo MJXc-space2" id="MJXc-Node-6"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.309em; padding-bottom: 0.441em;"> </span></span><span class="mjx-mn MJXc-space2" id="MJXc-Node-7"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.397em; padding-bottom: 0.353em;">5</span></span><span class="mjx-msubsup" id="MJXc-Node-8"><span class="mjx-base"><span class="mjx-mo" id="MJXc-Node-9"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.485em; padding-bottom: 0.572em;">)</span></span></span><span class="mjx-sup" style="font-size: 70.7%; vertical-align: 0.513em; padding-left: 0px; padding-right: 0.071em;"><span class="mjx-mn" id="MJXc-Node-10" style=""><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.397em; padding-bottom: 0.353em;">2</span></span></span></span><span class="mjx-mo" id="MJXc-Node-11"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.485em; padding-bottom: 0.572em;">(</span></span><span class="mjx-mi" id="MJXc-Node-12"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.221em; padding-bottom: 0.309em;">x</span></span><span class="mjx-mo MJXc-space2" id="MJXc-Node-13"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.309em; padding-bottom: 0.441em;">−</span></span><span class="mjx-mn MJXc-space2" id="MJXc-Node-14"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.397em; padding-bottom: 0.353em;">4</span></span><span class="mjx-mo" id="MJXc-Node-15"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.485em; padding-bottom: 0.572em;">)</span></span></span></span><span class="MJX_Assistive_MathML" role="presentation"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">(</mo><mn>2</mn><mi>x</mi><mo> </mo><mn>5</mn><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mo stretchy="false">(</mo><mi>x</mi><mo>−</mo><mn>4</mn><mo stretchy="false">)</mo></math></span></span><script id="MathJax-Element-1" type="math/tex">(2x 5)^2(x-4)</script> with respect to x.</p></body></html>
Question latex is Differentiate
{}protecthypertarget{MathJax-Element-1-Frame}{}{protecthypertarget{MJXc-Node-1}{}{protecthypertarget{MJXc-Node-2}{}{protecthypertarget{MJXc-Node-3}{}{{(}}protecthypertarget{MJXc-Node-4}{}{{2}}protecthypertarget{MJXc-Node-5}{}{{x}}protecthypertarget{MJXc-Node-6}{}{{ }}protecthypertarget{MJXc-Node-7}{}{{5}}protecthypertarget{MJXc-Node-8}{}{{protecthypertarget{MJXc-Node-9}{}{{)}}}{protecthypertarget{MJXc-Node-10}{}{{2}}}}protecthypertarget{MJXc-Node-11}{}{{(}}protecthypertarget{MJXc-Node-12}{}{{x}}protecthypertarget{MJXc-Node-13}{}{{−}}protecthypertarget{MJXc-Node-14}{}{{4}}protecthypertarget{MJXc-Node-15}{}{{)}}}}{((2x 5)^{2}(x - 4))}}((2x 5)^2(x-4))
with respect to x.
Как я могу удалить все » protect hypertarget{MJXc-Node-10}» из latex, оставив только
Differentiate {((2x 5)^{2}(x - 4))}}((2x 5)^2(x-4))
with respect to x.
Комментарии:
1. Не могли бы вы свести это к более простому примеру? Я не собираюсь отлаживать программу, содержащую нерелевантные детали, или бесконечно прокручивать вертикальный текст, чтобы узнать, что происходит. Но я буду рад помочь, если будет ясно, в чем вопрос.
2. извините, я отредактировал сообщение
3. Теперь, похоже, чего-то не хватает в выводе html. Я предполагаю, что
<span>
для каждого элемента в уравнении есть a (возможно, с идентификатором «MJXc-Node- *»), и эти промежутки преобразуютсяhypertarget
в LaTeX. Возможно, вы захотите использовать более короткое уравнение и опубликовать полный HTML / MathJax.4. я опубликовал полный HTML-код для вопроса, его немного много, но это был самый короткий вопрос, который я смог найти,
5. я также попытался удалить все элементы span в уравнении, но конвертер возвращает пустой latex ….{}
Ответ №1:
С MathJax уравнение на самом деле изначально существует в нотации TeX. Промежутки создаются MathJax Javascript для компоновки уравнений в HTML. В настоящее время вы позволяете MathJax сначала отобразить уравнение, захватить отображаемое уравнение, а затем попытаться преобразовать его обратно в исходное уравнение TeX. Было бы проще напрямую прочитать уравнение TeX без косвенного рендеринга Javascript.
Для достижения этого вам просто нужно отключить Javascript в Selenium. Например, с драйвером Firefox это должно сработать:
from selenium.webdriver.firefox.options import Options
from selenium import webdriver
opts = Options()
opts.preferences.update({
"javascript.enabled": False,
})
driver = webdriver.Firefox(options=opts)
В качестве альтернативы, если вам по какой-либо причине необходимо обработать отображаемую версию с включенным Javascript, вы можете попытаться получить доступ к содержимому элемента script внутри <p>
. Он содержит полное уравнение, но без разметки TeX math:
<p class="q_question">...<script type="math/tex">(2x 5)^2(x-4)</script>...</p>
Таким образом, вам не придется удалять промежутки. Затем вам нужно будет вложить его в разметку TeX math (...)
для PDF.