2011-07-06 18 views
8
>>> from lxml.etree import HTML, tostring 
>>> tostring(HTML('<fb:like>')) 
'<html><body><like/></body></html>' 

Lưu ý cách thẻ chuyển từ <fb:like> thành đơn giản <like>.Làm thế nào để bảo toàn thông tin không gian tên khi phân tích cú pháp HTML với lxml?

Điều này làm cho các trang xử lý kết hợp XFBML với lxml khó khăn hơn nhiều. (Điều tương tự cũng xảy ra với <g:plusone></g:plusone>)

Bất kỳ trợ giúp nào được đánh giá cao.

+2

HTML không có không gian tên. Chào mừng bạn đến với hậu quả của các yếu tố mở rộng. Nếu đó là XHTML + FBML (thay vì HTML + FBML) thì bạn có thể sử dụng một trình phân tích cú pháp XML. – Quentin

+0

Tôi sẽ có, nếu đó là XML. Điểm của các trình phân tích cú pháp HTML có khả năng phục hồi là họ hoàn thành công việc. Trong khi tôi không thích những cái tên ma thuật này, tôi nghĩ rằng nó là hợp lý để mong đợi từ lxml để bảo tồn chúng. Tôi sẽ cố gắng nói chuyện với những người bảo trì để xem liệu điều này có thể được cung cấp không. –

Trả lời

1

Thử thêm các định nghĩa tiền tố không gian tên bị thiếu. lxml sẽ avoid the namespaces otherwise, được cho là giúp bạn dễ dàng hơn.

Rất có thể trang web bạn cố gắng phân tích cú pháp sẽ không chứa các định nghĩa vùng tên này, vì vậy bạn nên thêm chúng.

Something như thế này: xmlns:adlcp="http://xxx/yy/zzz"

+1

Không hoạt động không may: http://pastebin.com/6zX3GSH2 –

1

Một cách để khắc phục vấn đề này là để patch libxml2.

Tham khảo mã nguồn của libxml2.9.2 (https: //git.gnome.org/browse/libxml2/tree/?id=v2.9.2), trong SAX2.c (https: //git.gnome .org/browse/libxml2/tree/SAX2.c? id = v2.9.2) (trình phân tích SAX nội bộ được sử dụng để tạo cây DOM) tại thuộc tính dòng 1699 với xmlns không được phân tích cú pháp khi ở chế độ HTML và chúng được phân tích cú pháp như bất kỳ thuộc tính nào khác tại dòng và 1740. Do đó, điều này có ý nghĩa khi điều chỉnh dòng 1622, chia tách tên thành tiền tố và phần cục bộ. Thay đổi:

name = xmlSplitQName(ctxt, fullname, &prefix); 

vào

if (!ctxt->html) { 
    name = xmlSplitQName(ctxt, fullname, &prefix); 
} else { 
    name = xmlStrdup(fullname); 
    prefix = NULL; 
} 

Sau đó libxml2 sẽ xem xét thẻ như <o:p> được cho các yếu tố với tên o:p, đó là, ruột kết được bao gồm trong tên phần tử không có ý nghĩa đặc biệt. Đây là giải thích chính xác trong HTML. Ví dụ: the HTML5 specification says:

Trong cú pháp HTML, tiền tố không gian tên và khai báo không gian tên không có tác dụng tương tự như trong XML. Ví dụ, dấu hai chấm không có ý nghĩa đặc biệt trong các tên phần tử HTML.

Hy vọng thay đổi này sẽ được phê duyệt cho phiên bản libxml2 trong tương lai. Có một báo cáo lỗi mở (https: //bugzilla.gnome.org/show_bug.cgi?id=654146).

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – Marcus

+0

@Marcus OK, đã thêm chi tiết tại đây. Xin lỗi về các liên kết xấu xí. Tôi không có đủ danh tiếng để bao gồm chúng như là các liên kết thực sự. – Insightfuls