2011-07-19 77 views
37

Trong python, cách thanh lịch nhất để tạo tài liệu HTML là gì. Tôi hiện đang tự thêm tất cả các thẻ vào một chuỗi khổng lồ và viết nó vào một tệp. Có cách nào thanh lịch hơn để làm điều này không?Tạo tài liệu HTML trong python

+2

có thể trùng lặp của [python phát html] (http://stackoverflow.com/questions/1548474/python-html-generator). Nếu bạn đang tạo XHTML, hãy xem xét sử dụng một công cụ XML. – You

+0

Có [một số hệ thống templating] (http://wiki.python.org/moin/Templating) có sẵn cho Python. Có phải đó là những gì bạn đang tìm kiếm? –

Trả lời

4

Tôi khuyên bạn nên sử dụng xml.dom để thực hiện việc này.

http://docs.python.org/library/xml.dom.html

đọc trang hướng dẫn này, nó có phương pháp để xây dựng XML (và do đó XHTML). Nó làm cho tất cả các nhiệm vụ XML dễ dàng hơn nhiều, bao gồm thêm các nút con, các kiểu tài liệu, thêm thuộc tính, tạo các nút văn bản. Điều này sẽ có thể hỗ trợ bạn trong phần lớn những điều bạn sẽ làm để tạo HTML.

Nó cũng rất hữu ích cho việc phân tích và xử lý các tài liệu xml hiện có.

Hope this helps

PS

Đây là một hướng dẫn mà sẽ giúp bạn với việc áp dụng các cú pháp

http://www.postneo.com/projects/pyxml/

+1

HTML không phải là một tập con của XML. Nếu bạn đang sử dụng một công cụ XML, bạn sẽ tạo ra XHTML, chứ không phải HTML. – You

+0

@Bạn là điểm công bằng tôi sẽ sửa câu trả lời của tôi –

+1

Đó là một sự thiếu nghiêm trọng mà Python không có xml, html cụ thể (ví dụ: có các phương thức như div (id = 'myid', otherattr = '.. . '), ul() vv) Phiên bản này là tiêu chuẩn (có các bên thứ 3). Perl và Ruby đều làm. – JDonner

0

Vâng, bạn đang tìm kiếm .writelines tập tin

Một chuỗi thường là một danh sách hoặc một mảng. Vì vậy, đặt tất cả các dòng của bạn vào một danh sách hoặc mảng. Và quăng chúng vào chức năng dưới đây.

Hãy chắc chắn để loại bỏ bất kỳ hằng dòng mới từ chuỗi của bạn chỉ để được an toàn

Python Documentation (search for file.writelines)

file.writelines (sequence) Viết một chuỗi các chuỗi vào tập tin. Trình tự có thể là bất kỳ đối tượng tạo chuỗi lặp nào, thường là một danh sách các chuỗi. Không có giá trị quay lại. Writelines() không thêm dấu tách dòng.)

23

Tôi khuyên bạn nên sử dụng một trong nhiều ngôn ngữ mẫu có sẵn cho python, ví dụ: built into Django (bạn không có để sử dụng phần còn lại của Django để sử dụng công cụ tạo khuôn mẫu của nó) - truy vấn google sẽ cung cấp cho bạn nhiều triển khai mẫu thay thế khác.

Tôi thấy rằng việc học thư viện mẫu giúp theo nhiều cách - bất cứ khi nào bạn cần tạo e-mail, trang HTML, tệp văn bản hoặc tương tự, bạn chỉ cần viết mẫu, tải nó với thư viện mẫu của bạn mã mẫu tạo ra sản phẩm đã hoàn thành.

Dưới đây là một số mã đơn giản để giúp bạn bắt đầu:

#!/usr/bin/env python 

from django.template import Template, Context 
from django.conf import settings 
settings.configure() # We have to do this to use django templates standalone - see 
# http://stackoverflow.com/questions/98135/how-do-i-use-django-templates-without-the-rest-of-django 

# Our template. Could just as easily be stored in a separate file 
template = """ 
<html> 
<head> 
<title>Template {{ title }}</title> 
</head> 
<body> 
Body with {{ mystring }}. 
</body> 
</html> 
""" 

t = Template(template) 
c = Context({"title": "title from code", 
      "mystring":"string from code"}) 
print t.render(c) 

Nó thậm chí còn đơn giản hơn nếu bạn có mẫu trên đĩa - kiểm tra render_to_string chức năng có thể tải mẫu từ đĩa từ một danh sách được xác định trước của con đường tìm kiếm, điền với dữ liệu từ một dictory và render thành một chuỗi - tất cả trong một cuộc gọi hàm.

+4

Tôi nghĩ về điều này, nhưng tôi không nghĩ đó chính là điều mà OP đang yêu cầu. Có vẻ như họ muốn xây dựng chính HTML theo lập trình, trong khi một mẫu giả sử bạn đã có HTML nhưng chỉ cần điền vào một số biến. –

+0

Có vẻ như họ có nội dung sẵn sàng và sau đó cần dán html xung quanh nội dung. Đây chính xác là công cụ tạo khuôn mẫu. – Wilduck

+2

Ngoài ra, nếu bạn muốn có một động cơ templating giống như một trong Django, sử dụng Jinja2. Nó nhanh hơn, mạnh hơn và là một dự án độc lập. http://jinja.pocoo.org/docs/ – Wilduck

26

Tôi tìm thấy yattag là cách thanh lịch nhất để thực hiện việc này.

from yattag import Doc 

doc, tag, text = Doc().tagtext() 

with tag('html'): 
    with tag('body'): 
     with tag('p', id = 'main'): 
      text('some text') 
     with tag('a', href='/my-url'): 
      text('some link') 

result = doc.getvalue() 

Nó đọc như html, với lợi ích bổ sung mà bạn không phải đóng thẻ.

1

Tôi đang sử dụng đoạn mã gọi là throw_out_your_templates đối với một số dự án của riêng tôi:

https://github.com/tavisrudd/throw_out_your_templates

https://bitbucket.org/tavisrudd/throw-out-your-templates/src

Thật không may, không có gói pypi cho nó và nó không phải là một phần của bất kỳ phân phối vì điều này chỉ có ý nghĩa như một chứng minh-khái niệm. Tôi cũng không thể tìm thấy ai đó đã lấy mã và bắt đầu duy trì nó như là một dự án thực tế. Tuy nhiên, tôi nghĩ rằng nó là giá trị một thử ngay cả khi nó có nghĩa là bạn phải gửi bản sao của riêng bạn của throw_out_your_templates.py với mã của bạn.

Tương tự như đề xuất sử dụng yattag của John Smith Tùy chọn, mô-đun này không yêu cầu bạn học bất kỳ ngôn ngữ tạo mẫu nào và cũng đảm bảo rằng bạn không bao giờ quên đóng thẻ hoặc trích dẫn các ký tự đặc biệt. Mọi thứ vẫn được viết bằng Python. Dưới đây là một ví dụ về cách sử dụng nó:

html(lang='en')[ 
    head[title['An example'], meta(charset='UTF-8')], 
    body(onload='func_with_esc_args(1, "bar")')[ 
     div['Escaped chars: ', '< ', u'>', '&'], 
     script(type='text/javascript')[ 
      'var lt_not_escaped = (1 < 2);', 
      '\nvar escaped_cdata_close = "]]>";', 
      '\nvar unescaped_ampersand = "&";' 
      ], 
     Comment(''' 
     not escaped "< & >" 
     escaped: "-->" 
     '''), 
     div['some encoded bytes and the equivalent unicode:', 
      '你好', unicode('你好', 'utf-8')], 
     safe_unicode('<b>My surrounding b tags are not escaped</b>'), 
     ] 
    ] 
0

Nếu bạn đang xây dựng tài liệu HTML hơn tôi đánh giá cao đề nghị sử dụng một hệ thống mẫu (như jinja2) như những người khác đã gợi ý. Nếu bạn cần một số bit html cấp thấp (có thể là đầu vào cho một trong các mẫu của bạn), thì gói xml.etree là gói python chuẩn và có thể phù hợp với hóa đơn độc đáo.

import sys 
from xml.etree import ElementTree as ET 

html = ET.Element('html') 
body = ET.Element('body') 
html.append(body) 
div = ET.Element('div', attrib={'class': 'foo'}) 
body.append(div) 
span = ET.Element('span', attrib={'class': 'bar'}) 
div.append(span) 
span.text = "Hello World" 


ET.ElementTree(html).write(sys.stdout, encoding='utf8', 
          method='html') 

In như sau:

<html><body><div class="foo"><span class="bar">Hello World</span></div></body></html>