【问题标题】:Parse the following from HTML code?从 HTML 代码中解析以下内容?
【发布时间】:2012-10-23 20:38:45
【问题描述】:

我将如何解析以下内容:

wr("website-url.com</span>")

使用 HTML 代码中的正则表达式?

似乎无法弄清楚如何提取website-url.com

位于 HTML 中的整个 JavaScript:

<script type="text/javascript">wr("<span>maddog");wr("@");wr("website-url.com</span>")</script>

尝试过像这样的正则表达式:

wr("(.+?)\s*<\/span>")

但似乎无法让它工作

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    想法是:

    • 使用一个正则表达式获取所有 wr(*) 字符串。
    • 删除引号 (")
    • 删除&lt;span&gt;&lt;/span&gt;

    这是 Python 中的一个解决方案。

    import re
    
    def geturl(text):
        '''
        Get all the wr(*) strings.
        Remove quotes.
        Remove <span> and </span>
        '''
        regex = re.compile(r'wr\(([^)]*)\)')
        match = regex.findall(xx)
        url = ''.join([s.replace('"', '') for s in match])
        url = url.replace('<span>', '').replace('</span>', '')
        return url
    
    if __name__ == '__main__':
        xx = '''<script type="text/javascript">wr("<span>maddog");wr("@");wr("website-url.com</span>")</script>'''
        url = geturl(xx)
        print url
    

    maddog@website-url.com

    【讨论】:

    • 我认为这个答案有两个问题 a) 试图用正则表达式解析 html(见 this linkb) OP 想要一个 c # 解决方案
    • 我将如何用 C# 编写它? :) 我不知道如何编写“获取所有 wr(*) 字符串”。
    【解决方案2】:

    您获得此 javascript 的网站似乎不希望您解析其 html。它使用 javascript 函数 wr 创建动态 html。下面是执行此 javascript 并解析结果代码的代码。但是我不能说这是一个简单的跟踪代码

    public void Test()
    {
        //C# object which will be accessed by javascript
        var csharpObj = new MyCSharpObject();
    
        //Create Javascript object
        Type scriptType = Type.GetTypeFromCLSID(Guid.Parse("0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC"));
        dynamic obj = Activator.CreateInstance(scriptType, false);
        obj.Language = "Javascript";
        obj.AddObject("csharp", csharpObj);
    
        //Load Html (your string in question)
        string html = @"<script type=""text/javascript"">wr(""<span>maddog"");wr(""@"");wr(""website-url.com</span>"")</script>";
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(html);
    
        //Create "wr" function
        string script = "function wr(s){csharp.wr(s);}";
    
        //Get the text of script tag                
        script += doc.DocumentNode.SelectSingleNode("//script").InnerText;
    
        //Execute script
        obj.Eval(script);
    
        //Load the string created by javascript execution
        doc.LoadHtml(csharpObj.Output);
    
        //tada.....
        var eMailAddress = doc.DocumentNode.InnerText;
    
        Console.WriteLine(eMailAddress);
    }
    
    [ComVisible(true)]
    public class MyCSharpObject
    {
        public string Output = "";
        public void wr(string s)
        {
            Output += s;
        }
    }
    

    --------编辑--------

    我不确定如何编写“获取所有 wr(*) 字符串

    虽然您似乎想要这样的解决方案,但我不会依赖正则表达式来解析 html

    public void Test2()
    {
        string html = @"<script type=""text/javascript"">wr(""<span>maddog"");wr(""@"");wr(""website-url.com</span>"")</script>";
    
        var parsedHtml = String.Join("",Regex.Matches(html, @"wr\(\""(.+?)\""\)")
                                                .Cast<Match>()
                                                .Select(m => m.Groups[1].Value));
    
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(parsedHtml);
        var eMailAddress = doc.DocumentNode.InnerText;
    }
    

    【讨论】:

      【解决方案3】:
      string a = <script type="text/javascript">wr("<span>maddog");wr("@");wr("website-url.com</span>")</script>;
      string[] b= a.replace("script type="text/javascript">","").replace("</script>","").split(';').ToArray();
      string c = b.Last();
      string d = c.replace("wr(","").replace("</span","");
      

      d 是最终结果,但您可以修改代码以处理字符串中的双引号。

      【讨论】:

      • 如果 html 代码永远不会改变,这可能会起作用,但即使是额外的 也会使此解决方案失败。
      【解决方案4】:

      如果您正在使用正则表达式来解析 HTML,那么您可能正在做一些您可能正在做的简单方法的困难的事情。在 C# 中,尝试使用 HTML Agility Pack。另请参阅definitive question 关于此事。

      【讨论】:

      • 它是 HTML 中的 javascript
      • 投反对票时请留言。
      • 如果是HTML中的javascript,为什么要标记它c#正则表达式?
      猜你喜欢
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 2021-12-30
      • 2017-10-29
      • 2014-10-18
      • 1970-01-01
      相关资源
      最近更新 更多