正则表达式从大型HTML源提取信息?

时间:2011-12-11 04:32:01

标签: c#

在很多html源码中我有一些像这样的元素

<option value=15>Bahrain - Manama</option>
<option value=73>Bangladesh - Dhaka</option>
<option value=46>Barbados - Bridgetown</option>
<option value=285>Belarus - Minsk</option>
<option value=48>Belgium - Brussels</option>
<option value=36>Belize - Belmopan</option>

我还有一个声明为Dictionary<string, int> Places = new Dictionary<string, int>();

的词典

我想要做的是从html中提取城市名称并将其放入Places中,然后提取数字代码并将其放入int中。对于第一个我要添加Placed.Add("Manama", 15);国家名称可以被忽略。但想法是扫描html源并自动添加城市。

这是我到目前为止所拥有的

string[] temp = htmlContent.Split('\n');
List<string> temp2 = new List<string>();
foreach (string s in temp)
{
    if (s.Contains("<option value="))
    {
        string t = s.Replace("option value=", ""); 
        temp2.Add(t); 
    }
}

这样可以删除一些文本,但后来我或多或少地想知道如何从文本中提取相关部分。我知道这真的很糟糕,但我正在学习:(

2 个答案:

答案 0 :(得分:4)

不要使用正则表达式 - 使用HtmlAgilityPack - 现在您可以使用Linq检索选项元素并在单行中构建字典:

HtmlDocument doc = new HtmlDocument();
//remove "option" special handling otherwise inner text won't be parsed correctly
HtmlNode.ElementsFlags.Remove("option"); 
doc.Load("test.html");

var Places = doc.DocumentNode
                .Descendants("option")
                .ToDictionary(x => x.InnerText.Split('-')[1].Trim(),
                              x => x.Attributes["value"].Value);

为了从选项值中提取城市名称,上面使用string.Split(),拆分分隔-,取第二个(城市)字符串并修剪任何前导或尾随空格。

答案 1 :(得分:0)

如果您要查找的唯一相关数据位于其中

string[] options = Regex.Split(theSource, "<option value="); // Splits up the source which is downloaded from the url

这样你就会立即遇到一串字符串,前几个字符就是你的int。如果整数总是超过10,即2个字符,你可以使用:

int y = 2; // pointer
string theString = options[x].substring(0,2); // if the numbers are always > 10 its quicker than a loop otherwise leave this bit out and loop the is below
if(options[x].substring(y,1)!=">") // check to see if the number has finished
{
    theString += options[x].substring(y,1);
    y++;
}
int theInt = int.Parse(theString);

要获取数字,如果需要更长的数字,可以使用指针循环if语句。如果数字不总是超过10,只需用指针循环if语句并忽略第一行。

然后我会重用字符串theString:

string[] place = Regex.Split(options[x], " - "); // split it immediately after the name
theString = place[0].substring(y, place[0].length - y); 

然后用

添加它们
Places.Add(theString, theInt);

如果代码不能正常工作,那么算法将会,确保拼写正确并且变量正在做他们应该做的事情