概述
我目前正在尝试为可以在此页面中找到的站点编写一个解析器。
我已经尝试过 XPath(我非常擅长),但我在尝试达到预期结果时失败了,所以我从昨天开始就一直在尝试使用正则表达式。
我的目标
我的目标是将这个 html 拆分为多个片段,每个片段都包含一个课程的数据。
例如:"AF - Bacharelado em Artes Visuais"
是课程名称,科目可以在蓝色表格中找到,直到08º Semestre: 24 Créditos
。
之后,您可以看到"AG - Licenciatura em Artes - Artes Visuais"
,这是一个新课程的开始,等等。
这个页面只有两门课程,但是这个可以有两个以上。
正则表达式问题
我的一个朋友帮了我一个忙,发现使用这种模式和选项可以达到课程的名称。这是一些代码:
// Creating Regular Expression to find name of courses
Regex regex = new Regex ("<p><br><b><font face=\"Arial,Helvetica\"><font color=\"#000099\"><font size=-1>(.+?)</font></font></font></b>", RegexOptions.Singleline);
int startIndex = 0;
while (regex.IsMatch (auxHtml, startIndex))
{
// Checking name of the course and saving it's offset
int index = regex.Match(auxHtml, startIndex).Groups[1].Index;
string courseName = regex.Match(auxHtml, startIndex).Groups[1].Value;
}
问题
由于我可以找到课程的名称和偏移量(索引),理论上,我可以将 Html 拆分为多个片段,其中每个片段仅包含与单个课程相关的数据。
这是我用来尝试的代码。
- htmlPages 是一个字符串列表
- auxHtml 是 WebRequest 检索到的 HtmlPage
代码
// Creating Regular Expression to find name of courses
Regex regex = new Regex ("<p><br><b><font face=\"Arial,Helvetica\"><font color=\"#000099\"><font size=-1>(.+?)</font></font></font></b>", RegexOptions.Singleline);
int startIndex = 0;
while (regex.IsMatch (auxHtml, startIndex))
{
// Checking name of the course and saving it's offset
int index = regex.Match(auxHtml, startIndex).Groups[1].Index;
string courseName = regex.Match(auxHtml, startIndex).Groups[1].Value;
// Adding name of the course and offset to dictionary
courseIndex.Add (courseName,index);
startIndex = regex.Match(auxHtml, startIndex).Groups[1].Index;
// Splitting HTML Page
if (regex.IsMatch(auxHtml, startIndex))
{
int endIndex = regex.Match (auxHtml, startIndex).Groups[1].Index;
endIndex = endIndex - startIndex;
htmlPiece = auxHtml.Remove(startIndex, endIndex);
}
htmlPages.Add(auxHtml);
}
我不知道为什么,但是索引有点乱。
第二个课程名称的索引是 8022,但是,如果我尝试:
auxHtml.Substring(0,8022)
它为我提供了在下一门课程名称之前结束的 html 的一部分。
我在这里想念什么?
这不就是一个Group的“Index”属性,是html页面中pattern开始的索引吗?