在很多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);
}
}
这样可以删除一些文本,但后来我或多或少地想知道如何从文本中提取相关部分。我知道这真的很糟糕,但我正在学习:(
答案 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);
如果代码不能正常工作,那么算法将会,确保拼写正确并且变量正在做他们应该做的事情