2012-05-14 18 views
7

Tôi muốn đọc văn bản trang web không có thẻ html và tiêu đề. tôi chỉ cần văn bản được hiển thị trong trình duyệt web.Cách đọc nội dung trang web trong C#?

tôi không cần như thế này

<html> 
<body> 
bla bla </td><td> 
bla bla 
<body> 
<html> 

tôi chỉ cần văn bản "bla bla bla bla".

Tôi đã sử dụng các phương pháp webclient và httpwebrequest để lấy nội dung HTML và tách dữ liệu nhận được nhưng không thể vì nếu tôi thay đổi trang web, các thẻ có thể thay đổi.

Vì vậy, có cách nào để chỉ hiển thị văn bản được hiển thị trên trang web một cách sai lệch không?

+0

Tôi nghĩ bạn sẽ cần một trình phân tích HTML và nếu bạn có quyền kiểm soát nguồn trang, để thêm id vào phần tử bạn muốn nhận, do đó, để lấy nó bằng một phương thức như getElementById của trình phân tích cú pháp. – alfoks

+0

@alfoks :: bạn có bất kỳ liên kết ví dụ nào cho trình phân tích cú pháp HTML không? –

Trả lời

4

Đây là cách bạn làm điều đó bằng cách sử dụng HtmlAgilityPack.

Đầu tiên mẫu HTML của bạn:

var html = "<html>\r\n<body>\r\nbla bla </td><td>\r\nbla bla \r\n<body>\r\n<html>"; 

tải nó lên (như là một chuỗi trong trường hợp này):

var doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(html); 

Nếu nhận được nó từ trang web, tương tự như:

var web = new HtmlWeb(); 
var doc = web.Load(url); 

Bây giờ chỉ chọn các nút văn bản có khoảng trắng và cắt chúng.

var text = doc.DocumentNode.Descendants() 
       .Where(x => x.NodeType == HtmlNodeType.Text && x.InnerText.Trim().Length > 0) 
       .Select(x => x.InnerText.Trim()); 

Bạn có thể có được điều này như là một chuỗi tham gia duy nhất nếu bạn thích:

String.Join(" ", text) 

Tất nhiên điều này sẽ chỉ làm việc cho các trang web đơn giản. Mọi thứ phức tạp cũng sẽ trả lại các nút có dữ liệu mà bạn rõ ràng không muốn, chẳng hạn như các hàm javascript, v.v.

+0

tuyệt vời nó làm việc ... cảm ơn thân yêu ... –

+0

:: làm thế nào tôi có thể truy cập chỉ mục văn bản theo chỉ mục như tôi làm với chuỗi mảng trong vòng lặp như thế này 'cho (i = 0; i

+0

Bạn có thể thực hiện điều này trực tiếp với 'văn bản':' foreach (var index in text) {// làm điều gì đó với chỉ mục} '. Ngoài ra, bạn có thể làm một 'text.ToArray();' và xử lý nó như một mảng. – yamen

-2
// Reading Web page content in c# program 
//Specify the Web page to read 
WebRequest request = WebRequest.Create("http://aspspider.info/snallathambi/default.aspx"); 
//Get the response 
WebResponse response = request.GetResponse(); 
//Read the stream from the response 
StreamReader reader = new StreamReader(response.GetResponseStream()); 
//Read the text from stream reader 
string str = reader.ReadLine(); 
for(int i=0;i<200;i++) 
{ 
    str += reader.ReadLine(); 

} 

Console.Write(str); 
+0

Bạn không thể xử lý HTML như một văn bản đơn giản hoặc với các biểu thức regualr, nó ** không phải là một văn bản hoặc ngôn ngữ thông thường. – Tigran

+0

Bằng cách này bạn vẫn nhận được tất cả đánh dấu. –

+0

@jaiff :: bạn có thể vui lòng xây dựng vòng lặp cuối cùng rằng tại sao bạn chỉ đọc nó đến 200 chỉ mục. –

5

Bạn cần sử dụng trình phân tích cú pháp HTML đặc biệt. Cách duy nhất để có được nội dung của không phải là ngôn ngữ thông thường.

Xem: What is the best way to parse html in C#?

+0

nó không phải là những gì tôi muốn nhận được. –

+0

Nhưng đây là một cách, bạn có thể nhận được những gì bạn đang yêu cầu! – Writwick

+0

@azeemAkram: sử dụng [HtmlAgilityPack] (http://htmlagilitypack.codeplex.com/) bạn có thể nhận được các giá trị mà bạn quan tâm. Cuối cùng, đây là trình phân tích cú pháp.Không được sử dụng các cụm từ thông dụng – Tigran

-1

Tôi nghĩ this link có thể giúp bạn.

/// <summary> 
/// Remove HTML tags from string using char array. 
/// </summary> 
public static string StripTagsCharArray(string source) 
{ 
char[] array = new char[source.Length]; 
int arrayIndex = 0; 
bool inside = false; 

for (int i = 0; i < source.Length; i++) 
{ 
    char let = source[i]; 
    if (let == '<') 
    { 
    inside = true; 
    continue; 
    } 
    if (let == '>') 
    { 
    inside = false; 
    continue; 
    } 
    if (!inside) 
    { 
    array[arrayIndex] = let; 
    arrayIndex++; 
    } 
} 
return new string(array, 0, arrayIndex); 
} 
+0

để phân tích cú pháp HTML – crdx

+0

Tác giả cung cấp cho bạn 3 phương pháp. Người cuối cùng (StripTagsCharArray) được đề nghị – R4j

+2

Bạn nghĩ phương pháp này sẽ quản lý như thế nào nếu nó gặp một câu lệnh if trong một số JavaScript được nhúng như 'if x <4'? Câu trả lời là: không tốt lắm. Câu trả lời đúng là câu trả lời gợi ý cho HtmlAgilityPack. – crdx

0
public string GetwebContent(string urlForGet) 
{ 
    // Create WebClient 
    var client = new WebClient(); 
    // Download Text From web 
    var text = client.DownloadString(urlForGet); 
    return text.ToString(); 
}