Cuối tháng rồi mà chưa có đề tài báo cáo, tiện đang làm dự án nho nhỏ về parse html nên dịch từ cái demo trên mạng cho ae nào cần sử dụng
Ở đây vấn đề phân tích cú pháp html không phải là vấn đề khó nhưng ít ai động đến, nhưng đây cũng là 1 ý tưởng 1 ứng dụng của mình đã lên store. Bạn biết đấy không cần làm gì cao siêu mà chỉ cần có những ý tưởng tưởng hơi điên rồ 1 chút là có thể tạo ra ứng dụng ngay. Các bạn cứ tưởng tượng đi nhé còn mình thì hãy vào bài viết hướng dẫn nhé =]]
Như các bạn đã biết, một trang web là tập hợp của các thẻ html được định nghĩa sẵn và webview chỉ hiển thị nội dung. Dưới đây sẽ là hình ảnh đơn giản nhất minh họa cho 1 trang web đơn giản.
Như trên, khi bạn muốn lấy văn bản nội dung "một số trang web", bạn phải đi từ nút html -> đầu -> tiêu đề, và dòng văn bản đó chính là nội dung của tiêu đề thẻ. Nếu theo xpath bạn sẽ đc. /html/đầu/tiêu đề
Còn khi muốn lấy "đây là đoạn thứ hai" bạn sẽ phải đi theo dòng sau. /html/body/p[class='special']
Có thể hơi khó hình dung chúng ta sẽ phải làm gì tiếp theo nên chúng ta cứ tạo dự án rồi làm theo sẽ hiểu
Đầu tiên chúng ta tạo dự án có tên phân tích cú pháp html
Tiếp theo chúng ta tạo ra 1 mô hình để chứa các thông tin cần lấy. Chúng ta tạo 1 class có tên DataItem kế thừa từ NSObject
#import
@interface DataItem : NSObject
@property [strong, nonatomic] NSString *name;
@property [strong, nonatomic] NSString *url;
@end
Tiếp tục tạo lớp có tên Contributor
@interface Contributor : NSObject
@property [strong, nonatomic] NSString *name;
@property [strong, nonatomic] NSString *imageUrl;
@end
Việc nữa là bạn sẽ thêm các thư viện trên github với liên kết sau
//github.com/topfunky/hpple
Bạn giải nén và sao chép các tệp sau.
url=[NSURL URLWithString:[NSString stringWithFormat:@"http://vovgiaothong.vn/luat-giao-thong/9"]];
data=[NSData dataWithContentsOfURL:url];
NSString *htmlbody=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog[@"%@",htmlbody];
Tiếp theo chúng ta sẽ sử dụng cái thư viện hpple để phân tích cái dữ liệu, sau đó chúng ta sẽ truy xuất kiểu xpath
NSURL *url=[NSURL URLWithString:link];
NSData *data=[NSData dataWithContentsOfURL:url];
NSString *htmlbody=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
TFHpple *hppleParser=[TFHpple hppleWithHTMLData:data];
NSString *query=@"//div[@class='title']/div";
Các bạn lưu ý, truy xuất dứ dưới dạng xpath thì dấu "//" tức là search mọi nơi cho đến khj cuối cây thì thôi. ở trên chuỗi truy vấn của mình, nó sẽ tìm ra các thẻ div có lớp tên là tiêu đề và lấy ra thẻ div phía trong. Có thể các bạn trẻ đã hiểu sơ qua về cách truy xuất trong xpath rồi, nếu chưa hiểu các bạn cứ luyện thêm đi hồi tưởng còn trẻ mình làm đoạn này cũng thắc mắc lắm. Bạn có thể tham khảo thêm phần mã trên reywenderlich sau.
Giờ quay lại trang web mà mình đã đưa lên trên. Chúng ta sẽ lấy tiêu đề và link + ảnh của bài viết. Các bạn tham khảo phần code dưới đây của mình
- [void]getData {
//1
NSURL *url=nil;
NSData *data=nil;
NSString *titleNews=nil;
NSString *imgTitle=nil;
NSString *link=nil;
NSArray *arrayTitle = nil;
NSArray *arrayImage = nil;
NSArray *arrayDesc = nil;
// for [int i=10; i