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).
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
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. –