【问题标题】:C# Text Matching HTMLC# 文本匹配 HTML
【发布时间】:2013-02-07 02:58:11
【问题描述】:

我正在尝试与一个非常糟糕的“网络服务”(巧妙地伪装成简单的 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 等?

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

【问题讨论】:

    标签: c# regex string xml-parsing


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      假设 html 元素保持静态,则不需要正则表达式。我的解决方案是找到&lt;b&gt;, &lt;/b&gt;, and &lt;br /&gt; 元素的索引,然后将子字符串从一个索引带到下一个索引。例如

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          您可以像这样使用 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 解析器并循环获取数据。

          希望对您有所帮助!有任何问题请告诉我。

          【讨论】:

            猜你喜欢
            • 2012-01-03
            • 1970-01-01
            • 1970-01-01
            • 2023-03-06
            • 1970-01-01
            • 1970-01-01
            • 2017-11-21
            • 2010-10-29
            • 2014-02-28
            相关资源
            最近更新 更多