C#文本匹配HTML

时间:2013-02-21 17:04:37

标签: c# regex string xml-parsing

我正在尝试与一个非常糟糕的“网络服务”进行交互(巧妙地伪装成简单的aspx页面......)但是我不控制页面所以我无法调整输出所以我卡住了用它。格式总是这样:

<b>
   <a href=\"http://www.google.com/\" target=\"_blank\">Google Inc</a>
</b>
<br />123 North Main
<br />Hume, ACT
<br />(999) 888-8888

所以,我需要解析URLNameAddressCityStatePhone?它不是真正正确形成的XML所以我不能使用XML解析器,RegEx看起来很痛苦,所以我坚持使用String.MatchIndexOf等?

感谢您的建议...... 詹姆斯

4 个答案:

答案 0 :(得分:2)

您可以使用HTML解析器来解析页面Html Agility Pack,这是一个免费且健壮的页面。或者您可以使用.Net的任何XQuery处理器,请查看此thread以查看使用regex解析html页面的缺点

答案 1 :(得分:1)

假设html元素保持静态,则不需要正则表达式。我的解决方案是找到<b>, </b>, and <br />元素的索引,然后从一个索引到下一个索引获取子串。例如

int bStartIndex = html.IndexOf("<b>");
int bEndIndex = html.IndexOf("</b>)");
int urlSize = bEndIndex - bStartIndex - 3;
string url = html.Substring(bStartIndex + 3, urlSize);

是的,这种方法是粗暴的,但是,考虑到“真正糟糕的网络服务”的情况,我认为这是一个公平而直接的解决方案,尽管很乏味。

答案 2 :(得分:0)

好吧,在过去,我尝试了许多其他方法来使用框架方法来获取内部值。但是这种格式太定制了,所以我认为唯一的方法是在响应中循环每一行,并且只要你得到一个值它就会有url。任何时候你开始读取行中的字符串,它将是地址,接下来是城市状态等等。 由于任何原因,对象的属性顺序到达不同的顺序行,代码将失败。 我建议你(如果可能的话)至少从服务中返回一个易于反序列化的JSON格式。在其他情况下,您应该构建自己的反序列化器以根据需要获取数据。

答案 3 :(得分:0)

你可以使用Regex.Replace(如果它总是以完全相同的方式格式化),如下所示:

string crappyXML = 
"<b>
   <a href=\"http://www.google.com/\" target=\"_blank\">Google Inc</a>
</b>
<br />123 North Main
<br />Hume, ACT
<br />(999) 888-8888";

string betterXML = Regex.Replace(crappyXML, "</b><br />", "</b><br>");

(如果之间有空格,您可能需要考虑该空间)

然后你的betterXML看起来像这样:

"<b>
   <a href=\"http://www.google.com/\" target=\"_blank\">Google Inc</a>
</b>
<br>123 North Main
<br />Hume, ACT
<br />(999) 888-8888";

然后你可以做另一个正则表达式:

betterXML = Regex.Replace(betterXML, "<br />", "</br><br>");

这会使它看起来像这样:

"<b>
   <a href=\"http://www.google.com/\" target=\"_blank\">Google Inc</a>
</b>
<br>123 North Main
</br><br>Hume, ACT
</br><br>(999) 888-8888";

然后就这样做:

betterXML += "</br>";

关闭最后一个标签。

再次,我的Regex.Replace代码都没有占用空格。您必须添加它。

从那里,你应该能够使用XML解析器并循环来获取你的数据。

我希望有所帮助!让我知道任何问题。