ProgramingTip

들여 쓰기를 사용하여 HTML을 파일로 예쁜 인쇄하는 방법

bestdevel 2021. 1. 5. 21:17
반응형

들여 쓰기를 사용하여 HTML을 파일로 예쁜 인쇄하는 방법


lxml.html사용하여 HTML을 생성하고 있습니다. 최종 결과를 html 파일로 예쁘게 인쇄하고 싶습니다. 어떻게하나요?

이것은 내가 지금까지 시도하고 얻은 것입니다 (Python과 lxml에 익숙하지 않습니다) :

import lxml.html as lh
from lxml.html import builder as E
sliderRoot=lh.Element("div", E.CLASS("scroll"), style="overflow-x: hidden; overflow-y: hidden;")
scrollContainer=lh.Element("div", E.CLASS("scrollContainer"), style="width: 4340px;")
sliderRoot.append(scrollContainer)
print lh.tostring(sliderRoot, pretty_print = True, method="html")

보시다시피 pretty_print=True속성을 사용하고 있습니다. 나는 그것이 거기에서 쓰기 된 코드를 줄 생각이라고 생각했습니다. 다음은 출력입니다.

<div style="overflow-x: hidden; overflow-y: hidden;" class="scroll"><div style="width: 4340px;" class="scrollContainer"></div></div>


결국 BeautifulSoup을 직접 사용하게되었습니다 . 그것은 lxml.html.soupparser 가 HTML을 구문 분석하는 데 사용하는 입니다.

BeautifulSoup은 그것이 정확히 어떤 방식으로 메소드를 가지고 있습니다. 적절한 들여 쓰기와 모든 것을 사용하여 HTML을 예쁘게 만듭니다.

BeautifulSoup은 HTML을 수정하지 못해서 코드가 깨진 상태로 유지됩니다. 그러나이 경우 생성 코드는 lxml에 의해 생성되는 HTML 코드는 의미 상 의미해야합니다.

내 질문에 주어진 예에서 다음을 수행해야합니다.

from BeautifulSoup import BeautifulSoup as bs
root = lh.tostring(sliderRoot) #convert the generated HTML to a string
soup = bs(root)                #make BeautifulSoup
prettyHTML = soup.prettify()   #prettify the html

내 대답이 지금은 도움이되지 않을 것입니다.

lxml.html.tostring(), 실제로 HTML을 pretty_print=True.

그러나 lxml.html- 의 "형제"는 lxml.etree잘 작동합니다.

따라서 다음과 같이 사용할 수 있습니다.

from lxml import etree, html

document_root = html.fromstring("<html><body><h1>hello world</h1></body></html>")
print(etree.tostring(document_root, encoding='unicode', pretty_print=True))

출력은 다음과 가변합니다.

<html>
  <body>
    <h1>hello world</h1>
  </body>
</html>

HTML을 형식화되지 않은 언어로 변수에 저장하면 html_string다음과 같이 beautifulsoup4를 사용하여 수행 할 수 있습니다.

from bs4 import BeautifulSoup
print(BeautifulSoup(html_string, 'html.parser').prettify())

내부적으로 lxmllibxml2트리를 사용 하는 데 사용 됩니다. 다음은 태그를 닫을 후 개행을 추가할지 여부를 결정하는 관련 코드 스 니펫입니다.

    xmlOutputBufferWriteString(buf, ">");
    if ((format) && (!info->isinline) && (cur->next != NULL)) {
        if ((cur->next->type != HTML_TEXT_NODE) &&
            (cur->next->type != HTML_ENTITY_REF_NODE) &&
            (cur->parent != NULL) &&
            (cur->parent->name != NULL) &&
            (cur->parent->name[0] != 'p')) /* p, pre, param */
            xmlOutputBufferWriteString(buf, "\n");
    }
    return;

따라서 노드가 요소이고 인라인 태그가 아니고 형제 노드 ( cur->next != NULL) 뒤 검사 고 그 중 하나가 p, pre, param아닌 경우 개행을 출력합니다.


더 많은 추가해도 문제가없는 문서 html5print 패키지를 사용할 수 있습니다 . 다른 솔루션에 비해 장점은 HTML 문서에 포함 된 CSS 및 Javascript 코드를 모두 아름답게 것입니다.

설치 광고 다음을 실행하십시오.

pip install html5print

그런 다음이를 명령으로 사용할 수 있습니다.

html5-print ugly.html -o pretty.html

또는 Python 코드로 :

from html5print import HTMLBeautifier
html = '<title>Page Title</title><p>Some text here</p>'
print(HTMLBeautifier.beautify(html, 4))

HTML Tidy 로 파이프하지 갑자기 발생합니까? 셸에서 또는 os.system().


BeautifulSoup prettify과 html5print의 HTMLBeautifier솔루션을 모두 시도했지만 yattag사용하여 HTML을 생성하기 때문에 indent멋지게 들여 쓰기 된 출력을 생성 하는 함수 를 사용하는 것이 더 적절 해 보입니다 .

from yattag import indent

rawhtml = "String with some HTML code..."

result = indent(
    rawhtml,
    indentation = '    ',
    newline = '\r\n',
    indent_text = True
)

print(result)

기발한 HTML성에 신경 쓰지 않는다면 (예를 들어 Netscpae 2.0을 사용하는 클라이언트를 절대적으로 지원해야하므로 <br>대신 사용하는 <br />것이 필수입니다) 항상 작동하는 것처럼 보이는 "xml"로 메서드를 변경할 수 있습니다. 이것은 아마도 lxml 또는 libxml의 버그 일 수 있지만 그 이유를 찾을 수 없습니다.


실제로 내 코드가 아니라 어딘가에서 선택했습니다.

def indent(elem, level=0):
    i = '\n' + level * '  '
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + '  '
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for elem in elem:
            indent(elem, level+1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i

다음과 함께 사용합니다.

indent(page)
tostring(page)

참조 URL : https://stackoverflow.com/questions/6150108/how-to-pretty-print-html-to-a-file-with-indentation

반응형