2010-02-13 42 views
9

Tôi đang tìm một cách đáng tin cậy để trích xuất văn bản cho địa chỉ web, trong ASP.NET/C#. Bất cứ ai có thể chỉ cho tôi hướng đi đúng không?Lấy văn bản từ một URL trong ASP.NET

Ngoài ra, địa chỉ web có thể là trang web tin tức có thể có nhiều quảng cáo và menu, v.v. Tôi cần một số cách thông minh để chỉ trích nội dung có liên quan. Bạn không chắc chắn làm thế nào điều này có thể được thực hiện như thế nào tôi sẽ xác định sự liên quan là gì?

Tôi có nên đọc từ nguồn cấp dữ liệu RSS không? Bất kỳ suy nghĩ về điều này?

EDIT Tôi đã thêm tiền thưởng. Tôi đang tìm cách trích xuất văn bản "có liên quan" từ một URL. Từ "có liên quan", tôi muốn loại trừ văn bản khỏi quảng cáo (và các thông tin không liên quan khác). Đầu vào sẽ tương tự như một trang tin tức. Tôi cần phải giải nén chỉ các thông tin tin tức và thoát khỏi các văn bản không liên quan

+1

Gói nhanh nhẹn HTML giúp bạn ở đây? –

Trả lời

4

Một khi bạn đã tải trang, và bắt đầu sử dụng một thư viện như HTML Agility Pack để phân tích html, sau đó công việc của bạn bắt đầu :)

Screen cào được chia thành hai phần.

Đầu tiên trình thu thập dữ liệu web (nhiều thông tin về điều này trên web và mã đơn giản được cung cấp tại đây với WebClient bằng một số câu trả lời khác). Trình thu thập thông tin phải duyệt qua các liên kết và trang tải xuống. Nếu bạn đang tải xuống nhiều trang và có url bắt đầu, bạn có thể cuộn trang của riêng mình hoặc sử dụng URL hiện có. Hãy xem Wikipedia để biết danh sách các trình thu thập dữ liệu web/trình thu thập nguồn mở.

Phần thứ hai là phân tích cú pháp html và chỉ kéo ra văn bản bạn muốn và bỏ qua mọi tạp âm (tiêu đề, biểu ngữ, chân trang, v.v.). Chỉ cần duyệt qua DOM dễ dàng với các thư viện hiện có, tìm hiểu xem bạn phải làm gì với những gì bạn phân tích là phần khó.

Tôi đã viết một chút về nó trước khi vào một SO question và nó có thể cung cấp cho bạn một số ý tưởng cách lấy thủ công nội dung bạn muốn. Theo kinh nghiệm của tôi, không có cách nào 100% để tìm nội dung chính của một trang và thường xuyên hơn là bạn không cần phải cung cấp một số con trỏ theo cách thủ công. Phần khó khăn là nếu bố cục html của trang thay đổi, thì scraper màn hình của bạn sẽ bắt đầu thất bại.

Bạn có thể áp dụng số liệu thống kê và so sánh html của một số trang để suy ra vị trí quảng cáo, menu, v.v ... để loại bỏ chúng.

Vì bạn đề cập đến các trang web tin tức, có hai cách tiếp cận khác sẽ dễ áp ​​dụng hơn cho các trang web này so với phân tích cú pháp văn bản từ html gốc.

  1. Kiểm tra xem trang có url in hay không. Ví dụ. một liên kết trên CNN có một url in tương đương dễ phân tích cú pháp hơn.
  2. Kiểm tra xem trang có biểu diễn RSS hay không và chọn văn bản bài viết từ nguồn cấp dữ liệu RSS thay thế. Nếu nguồn cấp dữ liệu không có tất cả nội dung, nó sẽ cung cấp cho bạn đủ văn bản để định vị văn bản trong trang html đầy đủ.

Ngoài ra, hãy kiểm tra The Easy Way to Extract Useful Text from Arbitrary HTML để biết cách tạo trình phân tích cú pháp tổng quát hơn. Mã này bằng Python nhưng bạn sẽ có thể chuyển đổi nó mà không gặp quá nhiều rắc rối.

-4

Một khi bạn có các trang web mã html, bạn coud sử dụng Regular Expressions

+1

Một cái gì đó như "\ w +" –

+4

Phân tích HTML với regex là không thể. Đừng lãng phí thời gian của bạn. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

0

Để có được đánh dấu html thực tế, hãy thử các WebClient vật. Nội dung như thế này sẽ giúp bạn đánh dấu:

System.Net.WebClient client = new System.Net.WebClient(); 

     // Add a user agent header in case the 
     // requested URI contains a query. 

     client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 

     Stream data = client.OpenRead ("http://www.google.com"); 
     StreamReader reader = new StreamReader (data); 
     string s = reader.ReadToEnd(); 
     //"s" now contains your entire html page source 
     data.Close(); 
     reader.Close(); 

Sau đó, như isc-fausto đã nói, bạn có thể sử dụng cụm từ thông dụng để phân tích đầu ra nếu cần.

+0

Bất kỳ URL nào cần được ứng dụng này hỗ trợ.Vì các trang web không theo cùng một mẫu, tôi không chắc liệu trình phân tích cú pháp có thể thông minh trong việc loại bỏ dữ liệu "không thích hợp" – Nick

+2

Cố gắng sử dụng các biểu thức chính quy để phân tích cú pháp HTML có thể thực sự mang tính lông và bực bội hay không. Sử dụng gói Agility HTML nếu bạn có thể - đó là trình phân tích cú pháp DOM, là REALLY những gì bạn cần để trích xuất văn bản từ HTML. –

+0

Gói nhanh nhẹn ở đâu? Tôi sử dụng mã của Steve để lấy HTML và chạy nó qua gói để loại bỏ các thẻ html và nội dung không có liên quan và nhận được văn bản thuần túy? Có phương pháp được xây dựng trong gói nhanh nhẹn để làm điều này không? Cảm ơn – Nick

3

Tôi nghĩ bạn cần một trình phân tích cú pháp html như HTMLAgilityPack hoặc bạn có thể sử dụng em bé mới sinh .. YQL, một công cụ mới được phát triển bởi Yahoo cú pháp của nó giống như SQL và bạn cần một chút kiến ​​thức về XPATH ...

http://developer.yahoo.com/yql/

Thank

2

Sử dụng một trường hợp WebClient để có được đánh dấu của bạn ...

Dim Markup As String 

Using Client As New WebClient() 
    Markup = Client.DownloadString("http://www.google.com") 
End Using 

Và sau đó 0.123.để phân tích phản ứng với XPath ...

Dim Doc As New HtmlDocument() 
Doc.LoadXML(Markup) 

If Doc.ParseErrors.Count = 0 Then 
    Dim Node As HtmlNode = Doc.DocumentNode.SelectSingleNode("//body"); 

    If Node IsNot Nothing Then 
     'Do something with Node 
    End If 
End If 
+0

Rất vui được thấy một số VB ở đây. Tuy nhiên, tôi sẽ lưu ý rằng có một thẻ C# trong câu hỏi. Bạn có thể nhận được nhiều phiếu bầu hơn nếu bạn cung cấp cả hai. – Armstrongest

+0

@Atomiton http://codechanger.com –

0

Kỹ thuật tóm tắt văn bản là những gì bạn có thể làm sau. Nhưng với tư cách là một heuristic thô, bạn có thể làm điều này với một số bước tương đối đơn giản miễn là bạn không đếm trên 100% kết quả hoàn hảo tất cả các thời gian.

Miễn là bạn không cần hỗ trợ các hệ thống viết không có dấu cách giữa các từ (tiếng Trung, tiếng Nhật), bạn có thể nhận được kết quả khá tốt bằng cách tìm kiếm vài chuỗi đầu tiên của chuỗi từ liên tiếp một ngưỡng tùy ý mà bạn sẽ dành một vài ngày điều chỉnh. (Trung Quốc và Nhật Bản sẽ yêu cầu một thuật toán xác định từ hợp lý phá vỡ thêm vào này heuristic).

tôi sẽ bắt đầu với một HTML Parser (HTML Agility Pack trong Dotnet, hoặc một cái gì đó giống như Nokogiri Ruby hoặc BeautifulSoup Python nếu bạn muốn thử nghiệm với các thuật toán trong một môi trường tương tác nhiều hơn trước khi cam kết với giải pháp C# của bạn).

Để giảm không gian tìm kiếm, chuỗi các liên kết có ít hoặc không có văn bản xung quanh bằng cách sử dụng các tính năng của trình phân tích cú pháp HTML của bạn. Điều đó sẽ loại bỏ hầu hết các bảng điều hướng và một số loại quảng cáo nhất định. Bạn có thể mở rộng thêm điều này để tìm các liên kết có các từ sau chúng nhưng không có dấu chấm câu; điều này sẽ loại bỏ các liên kết mô tả.

Nếu bạn bắt đầu thấy dòng chữ chạy theo sau "." hoặc "," có nghĩa là, từ 5 từ trở lên (bạn có thể thử điều chỉnh sau), bạn sẽ bắt đầu cho điểm đó là một đoạn câu hoặc câu có thể có tiềm năng. Khi bạn tìm thấy một số lần chạy liên tiếp, điều đó có tỷ lệ cược khá tốt là phần quan trọng nhất của trang. Bạn có thể ghi điểm văn bản với các thẻ <p> xung quanh nó cao hơn một chút. Một khi bạn có một số tiền hợp lý của các loại trình tự, tỷ lệ cược là khá tốt mà bạn đã có "nội dung" chứ không phải là bố cục chrome.

Điều này sẽ không hoàn hảo, và bạn có thể cần phải thêm một cơ chế để tinh chỉnh heuristic dựa trên cấu trúc trang có vấn đề mà bạn thường xuyên quét. Nhưng nếu bạn xây dựng một cái gì đó dựa trên phương pháp này, nó sẽ cung cấp kết quả khá hợp lý cho 80% hoặc hơn nội dung của bạn.

Nếu bạn thấy loại phương pháp này không đầy đủ, bạn có thể muốn xem xét xác suất Bayes hoặc Mô hình ẩn Markov như một cách để cải thiện kết quả.

Các vấn đề liên quan