2012-05-14 2 views
7

Я хочу прочитать текст сайта без html-тегов и заголовков. Мне просто нужен текст, отображаемый в веб-браузере.Как читать содержимое веб-сайта в C#?

мне не нужно, как этот

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

я просто нужно текст «бла-бла-бла-бла».

Я использовал методы webclient и httpwebrequest для получения содержимого HTML и разделения полученных данных, но это невозможно, потому что, если я изменю сайт, теги могут измениться.

Итак, можно ли каким-либо образом получить только отображаемый текст на веб-сайте?

+0

Я думаю, что вы будете нуждаться в HTML-парсер, и если у вас есть контроль исходного кода страницы, чтобы добавить идентификатор элемент, который вы хотите получить, чтобы получить его с помощью метода getElementById анализатора. – alfoks

+0

@alfoks :: У вас есть ссылка на пример для парсера HTML? –

ответ

4

Вот как вы могли бы сделать это с помощью HtmlAgilityPack.

Сначала ваш образец HTML:

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

Загрузите его (в виде строки в данном случае):

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

Если получение его из Интернета, похоже:

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

Теперь выберите только текстовые узлы без пробелов и обрезайте их.

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

Вы можете получить это как один присоединился строку, если вы хотите:

String.Join(" ", text) 

Конечно, это будет работать только для простых веб-страниц. Все, что комплекс будет также возвращать узлы с данными вы явно не хотите, например, яваскрипта функций и т.д.

+0

Удивительно, что это сработало ... спасибо, дорогой ... –

+0

:: как я могу получить доступ к текстовому индексу по индексу, как я делаю с строковым массивом в цикле, как этот 'for (i = 0; i

+0

Вы можете сделать это прямо против 'text':' foreach (индекс var в тексте) {// делаем что-то с индексом} '. Кроме того, вы можете сделать 'text.ToArray();' и обрабатывать его как массив. – 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

Вы не можете рассматривать HTML как простой текст или выражения regualr, это ** не ** обычный текст или язык. – Tigran

+0

Таким образом, вы все равно получаете разметку. –

+0

@jaiff :: Не могли бы вы продумать последний цикл, почему вы читаете его только 200 индексов. –

5

Вам нужно использовать специальный HTML-парсер. Единственный способ получить содержимое такого обычного не.

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

+0

его не то, что я хочу получить .... –

+0

Но это один из способов, вы можете получить то, что вы просите! – Writwick

+0

@azeemAkram: используя [HtmlAgilityPack] (http://htmlagilitypack.codeplex.com/), вы можете получить интересующие вас значения. В конце это Parser. – Tigran

-1

Я думаю this link может помочь вам.

/// <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

регулярные выражения не должны использоваться для разбора HTML – crdx

+0

Автор дает вам 3 метода. Последний (StripTagsCharArray) рекомендуется – R4j

+2

Как вы думаете, этот метод будет работать, если он встретит оператор if внутри некоторого встроенного JavaScript, например «if x <4»? Ответ: не очень хорошо. Правильный ответ - тот, который предлагает 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(); 
} 
Смежные вопросы