2009-11-16 7 views
8

Nó sẽ có thể tạo, sửa đổiđọc X/HTML trong một cao hướng đối tượng cách mà vẫn cảm thấy DOM thích nhưng không phải là béo phì, và thực sự là Pythonic. Tốt hơn là nó cũng sẽ xử lý HTML không đúng định dạng, nhưng chúng tôi có thể bỏ qua điều này cho các mẫu.Mô-đun phân tích cú pháp/mô-đun/máy phát/mẫu Pythonic XHTML/HTML nhất hỗ trợ DOM như truy cập là gì?

Ví dụ, tôi muốn làm điều này:

>> from someAmazingTemplate import * 
>> html = Template('<html><head><title>Hi</title></head><body></body></html>') 
>> html.head.append('<link type="text/css" href="main.css" rel="stylesheet" />') 
>> html.head.title 
Hi 
>> html['head']['title'] 
Hi 

tôi nên có thể sử dụng/xác định chức năng ngắn và sử dụng chúng như thế này:

>> html.head.append(stylesheet(href="main.css")) 
>> html.body.append(h1('BIG TITLE!12',Class="roflol")) 
>> html.body.SOURCE 
<body> 
    <h1 class="roflol"> 
     BIG TITLE!12 
    </h1> 
</body> 

Lưu ý: Nếu nó doesn không tồn tại, tôi sẽ làm cho nó theo giấy phép BSD/MIT/Python. Giúp đỡ được chào đón nhiều nhất. Mọi thứ hoạt động theo hướng phát triển ứng dụng web Pythonic sẽ trở nên tuyệt vời. Rất cảm kích!

-Luke Stanley

+0

Amara Bindery, pyWeb và BeautifulSoup đang được điều tra. Tôi nghi ngờ tôi sẽ phải quấn chúng lại với nhau để có được một cái gì đó thực sự thanh lịch. –

+0

Ví dụ về ElementTree của Synack cũng cho thấy một cơ sở rất tốt, tôi sẽ đăng bài ở đây –

Trả lời

5

Phần lon đầu tiên cho hầu hết các phần được thực hiện bằng ElementTree, nhưng phải mất một vài bước nữa:

>>> import xml.etree.ElementTree as ET 
>>> html = ET.XML('<html><head><title>Hi</title></head><body></body></html>') 
>>> html.head = html.find('head') 
>>> html.head.append(ET.XML('<link type="text/css" href="main.css" rel="stylesheet" />')) 
>>> html.head.title = html.head.find('title') 
>>> html.head.title.text 
'Hi' 

Phần thứ hai có thể được hoàn thành bằng cách tạo ra đối tượng Element, nhưng bạn sẽ cần phải làm một số công việc riêng của mình để làm cho nó xảy ra theo cách bạn thực sự muốn:

>>> html.body = html.find('body') 
>>> my_h1 = ET.Element('h1', {'class': 'roflol'}) 
>>> my_h1.text = 'BIG TITLE!12' 
>>> html.body.append(my_h1) 
>>> html.body.SOURCE = ET.tostring(html.body) 
>>> html.body.SOURCE 
'<body><h1 class="roflol">BIG TITLE!12</h1></body>' 

bạn có thể tạo một hàm stylesheet của riêng bạn:

>>> def stylesheet(href='', type='text/css', rel='stylesheet', **kwargs): 
...  elem = ET.Element('link', href=href, type=type, rel=rel) 
...  return elem 
... 
>>> html.head.append(stylesheet(href="main.css")) 

Và toàn bộ tài liệu:

>>> ET.tostring(html) 
<html><head><title>Hi</title><link href="main.css" rel="stylesheet" type="text/css" /></head><body><h1 class="roflol">BIG TITLE!12</h1></body></html> 

Nhưng, tôi nghĩ rằng nếu bạn đang đi để kết thúc bằng văn bản việc của riêng bạn, đây là một nơi tốt để bắt đầu. ElementTree rất mạnh mẽ.

Chỉnh sửa: Tôi nhận thấy rằng đây có thể không chính xác những gì bạn đang tìm kiếm. Tôi chỉ muốn cung cấp một cái gì đó như là một thay thế có sẵn và cũng chứng minh rằng nó thực sự có thể được thực hiện mà không có quá nhiều công việc.

+0

Rất cảm ơn Synack. Tôi sẽ cố gắng và xem liệu tôi có thể bash này vào những gì tôi chỉ định với một số hàm bao. Bạn có muốn được cập nhật không? Tôi sẽ đăng một followup ở đây. –

+0

Tuyệt đối, tôi rất thích xem nó ra sao. Tôi nghĩ điều này nghe có vẻ vui. – jathanism

+0

Tôi đang sử dụng nó như là một phần của một MVC. Tôi muốn sử dụng nó làm mô hình trung gian. Tôi không có gì chống lại bằng cách sử dụng ngôn ngữ templating là tốt mặc dù. Nếu kết hợp với PyJS (Pyjamas), nó có thể là một con quái vật mạnh mẽ. Tôi muốn sử dụng một chút JQuery quá mặc dù. –

1

Amara Bindery cung cấp API XML Pythonic nhất mà tôi đã xem. Xem quick reference, manualfaq

+0

Có thể là một cơ sở tốt, cảm ơn Quark! * Điều tra * –

+0

Bạn biết điều này đang tìm kiếm hứa hẹn nhất bây giờ tôi đã có thêm thời gian để so sánh nó. Nó chèn Vào lúc bắt đầu HTML của tôi. Tôi đang tìm một bản sửa lỗi ngay bây giờ. –

+0

tôi biên soạn phiên bản mới nhất, sau đó làm việc này: >>> từ amara nhập khẩu * >>> doc = parse (' Hi') >>> print doc.xml_encode ((" html-indent ")) Hi hơn ví dụ và gói hành động sau –