2011-12-10 19 views
7

Tôi mới sử dụng XPath. Tôi đang cố gắng phân tích cú pháp một trang bằng XPath. Tôi cần lấy thông tin từ thẻ, nhưng thoát khỏi dấu nháy đơn trong tiêu đề vít lên tất cả mọi thứ.Thẻ phân tích cú pháp XPath bằng dấu nháy đơn

Để phân tích cú pháp, tôi sử dụng Grab.

thẻ từ nguồn:

<img src='somelink' border='0' alt='commission:Alfred\'s misadventures' title='commission:Alfred\'s misadventures'> 

XPath Thực tế:

g.xpath('.//tr/td/a[3]/img').get('title') 

Returns

commission:Alfred\\ 

Có cách nào để sửa lỗi này?

Cảm ơn

+4

Thành thật mà nói, bạn nên vui mừng vì '.xpath' trả về bất kỳ thứ gì. HTML này không hợp lệ cho mô-đun 'html' của LXML để choke trên đó. –

+2

Tôi đã thực hiện một số thử nghiệm với lxml và BeautifulSoup và cả hai đều không phân tích cú pháp chính xác. Rõ ràng, các dấu ngoặc kép bên ngoài cho các giá trị thuộc tính phải là dấu ngoặc kép. Nguồn html là gì? – ekhumoro

Trả lời

5

rác vào, rác ra. Dữ liệu nhập của bạn không được định dạng tốt, vì nó không đúng cách thoát khỏi ký tự trích dẫn đơn. Nhiều ngôn ngữ lập trình (kể cả Python) sử dụng ký tự dấu gạch chéo ngược để thoát khỏi dấu ngoặc kép trong chuỗi ký tự. XML thì không. Bạn nên hoặc 1) bao quanh giá trị của thuộc tính với dấu ngoặc kép; hoặc 2) sử dụng &apos; để bao gồm một dấu ngoặc đơn.

Từ the XML spec:

Để cho phép các giá trị thuộc tính để chứa cả đơn và đôi dấu ngoặc kép, apostrophe hoặc ký tự single-quote (') có thể được biểu diễn như " &apos;", và đôi quote nhân vật (") là" &quot;".

+0

Cảm ơn bạn đã thông tin, nhưng nó không phải là đầu vào của tôi. Tôi đang cố phân tích một trang với thẻ đó, vì vậy chỉ có cách để sửa lỗi này - thay thế nó trong toàn bộ nguồn. Rất vui, tôi đã giải quyết (không chính xác, nhưng dù sao ...) vấn đề này với regex –

+1

XML phá vỡ luật của Postel, nhưng trong thực tế đôi khi nó cần thiết để xoa bóp đầu vào trước khi gửi nó đến một trình phân tích cú pháp XML thích hợp. Một số người thuần túy sẽ bẻ khóa bạn vì điều đó, nhưng tôi sẽ không cảm thấy quá tệ về điều đó. –

+0

XML đã cho phép HAI phương thức nhận một dấu nháy đơn vào một giá trị thuộc tính: (1) kèm theo giá trị trong dấu ngoặc kép thay vì dấu nháy đơn (2) sử dụng. '''. Hãy làm cho nó tương thích với Postel và thêm hai phương thức bổ sung. (1) dấu gạch chéo ngược-thoát (2) dấu nháy đơn-tăng gấp đôi, như trong SQL. Nhiệm vụ của bạn: cập nhật ngữ pháp, nâng cao trình phân tích cú pháp. Thay thế: Hãy vui mừng vì XML đã tránh được sự xáo trộn HTML nơi người tiêu dùng đi ra ngoài để chấp nhận HTML xấu. –

1

khi cung cấp 'XML' không phải là một tài liệu wellformed do dấu nháy lồng nhau, không có biểu hiện XPath có thể được đánh giá trên đó .

Các cung cấp không tốt được hình thành văn bản có thể được sửa chữa để:

<img src="somelink" 
border="0" 
alt="commission:Alfred's misadventures" 
title="commission:Alfred's misadventures"/> 

Trong trường hợp có một requiremend lạ không sử dụng dấu ngoặc kép, sau đó một chuyển đổi chính xác là:

<img src='somelink' 
border='0' 
alt='commission:Alfred&apos;s misadventures' 
title='commission:Alfred&apos;s misadventures'/> 

Nếu bạn được cung cấp đầu vào không chính xác, bằng ngôn ngữ như C# người ta có thể cố gắng chuyển đổi nó thành đối tác chính xác của nó bằng cách sử dụng:

string correctXml = input.replace("\\'s", "&apos;s") 

Có thể có cách tương tự để thực hiện tương tự trong Python.