如何解析两个标签之间的文本?

时间:2014-02-15 10:34:52

标签: c# winforms

我有一个字符串长字符串,其中包含一些标记:

client.Encoding = System.Text.Encoding.GetEncoding(1255);

string page = client.DownloadString("http://rotter.net/scoopscache.html");
StreamWriter w = new StreamWriter(@"d:\rotterhtml\rotterscoops.html");
w.Write(page);
w.Close();

我想从页面变量或html文件中获取两个标记之间的所有文本:

<a href="http://rotter.net/cgi-bin/forum/dcboard.cgi?az=read_count&om=81020&forum=scoops1"><b>test</b>

我想解析单词test。所以最后我会说出所有的话:

<a href="http://rotter.net/cgi-bin/forum/dcboard.cgi?az=read_count&om=81020&forum=scoops1"><b>

</b>

编辑**

这是构造函数中我如何保存html文件:

client.Encoding = System.Text.Encoding.GetEncoding(1255);
string page = client.DownloadString("http://rotter.net/scoopscache.html");
StreamWriter w = new StreamWriter(@"d:\rotterhtml\rotterscoops.html");
w.Write(page);
w.Close();
ExtractText(@"d:\rotterhtml\rotterscoops.html");

private void ExtractText(string filePath)
        {
            List<string> text = new List<string>();
            var htmlDoc = new HtmlAgilityPack.HtmlDocument();
            htmlDoc.OptionFixNestedTags = true;
            htmlDoc.Load(filePath);

            if (htmlDoc.DocumentNode != null)
            {
                var nodes = htmlDoc.DocumentNode.SelectNodes("//a/b");
                foreach (var node in nodes)
                {
                    //Console.WriteLine(node.InnerText);
                    text.Add(node.InnerText);
                }
            }
        }

在文本列表中,我看不到希伯来语,而是胡言乱语。 我的硬盘上的html文件,我看到里面的希伯来字体,因为我在构造函数中编码它。 但是在文本列表中,我再次看到它是乱七八糟的。

1 个答案:

答案 0 :(得分:2)

您可以使用HtmlAgilityPack之类的HTML解析库,这样您就可以轻松找到标记中要查找的信息:

string filePath = @"d:\rotterhtml\rotterscoops.html"

var htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.OptionFixNestedTags = true;
htmlDoc.Load(filePath);

if (htmlDoc.DocumentNode != null)
{
    var nodes = htmlDoc.DocumentNode.SelectNodes("//a/b");
    foreach (var node in nodes)
    {
        Console.WriteLine(node.InnerText);
    }
}

在此示例中,我选择了嵌套在<b>标记内的所有<a>标记的值。您可能需要调整选择器以满足您的需求:

htmlDoc.DocumentNode.SelectNodes("//a/b");