Phân tích cú pháp html thành văn bản

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ìn rõ hơn các bạn có thể nhìn hình ảnh sau, nó sẽ minh hoạ cho chúng ta về phân cấp các thẻ trong một trang web.

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.

Bạn nhớ tạo 1 thư mục hpple và thả các tệp vừa chọn phía trên vào nhé. Nhớ chọn copy item và target nữa nhé.
Tiếp tục theo chúng ta thêm thư viện libxml2
Giờ chúng ta sẽ lấy html từ liên kết sau. http. //vovgiaothong. vn/luat-giao-thong/9 Trước tiên chúng ta cần phải lấy nguồn của trang web đã về. cái hướng dẫn của reywenderlich nó ko nói rõ cái này nhưng mình sẽ đưa ra hàm lấy source cho các bợn trẻ dễ hiểu.

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

Chủ Đề