从生成的 <script> 中提取数据并处理结果

Posted

技术标签:

【中文标题】从生成的 <script> 中提取数据并处理结果【英文标题】:Data extraction from a generated <script> and process the results 【发布时间】:2020-07-03 20:16:33 【问题描述】:

 string Url= "https://www.audiusa.com/dealers-webapp/map/dealer/423E99";   
     htmlWeb web = new HtmlWeb();
                            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                            HtmlDocument doc = web.Load(Url);
     var scriptGoogleTagManager = doc.DocumentNode.SelectNodes("//script").Where(x => x.InnerHtml.Contains("window.Audi.Vars.searchType"));
                            if (scriptGoogleTagManager )
                            
                                foreach(var tag in scriptGoogleTagManager)
                                
                                    var s = tag.InnerText;
                                    Regex r = new Regex("\\s+window\\.Audi\\.Vars\\.searchResult\\s+\\=\\s+");
                                    Match m = r.Match(s.ToLower());
                                
                            

在上面的脚本中,我想在 window.Audi.Vars.searchResult = 和 window.Audi.Vars.dealers = 之后提取值。我在正则表达式中遇到问题,因为我对此了解不多。请帮助我

【问题讨论】:

s变量的内容是什么? 如果您打开提供的Url的页面源并使用上面给出的特定字符串搜索脚本。然后您将能够找到s的值。 @GvS 【参考方案1】:

我知道你想摆脱例如 window.Audi.Vars.searchResult =

var extract = s.slice(31); // since the string "window.Audi.Vars.searchResult =" has 31 chars

slice() 方法提取字符串的一部分并在新字符串中返回提取的部分。使用 start 和 end 参数指定要提取的字符串部分。这里我们只给出开始参数,它会提取到结尾。第一个字符的位置为 0,第二个字符的位置为 1,依此类推。 >br> 正则表达式在替换时很好,在这里删除字符串中的字符是一种更简单的方法。

修改你的代码并发布控制台结果:

 var scriptGoogleTagManager = doc.DocumentNode.SelectNodes("//script").Where(x => x.InnerHtml.Contains("window.Audi.Vars.searchType"));
                    if (scriptGoogleTagManager )
                    
                        foreach(var tag in scriptGoogleTagManager)
                        
                            var s = tag.InnerText;
                            console.debug("[content of s] " + s); 
                            var extract = s.slice(31); // since the string
                        
                    

【讨论】:

slice 显示错误,字符串不包含其定义@Codebreker007 请编辑您的问题并插入行的结果 console.debug("[content of s] "+ s);放在 var s = tag.InnerText; 之后在您的代码中 var s @Codebreaker007 的内容见上图 我很感兴趣 consol.debug 会给你带来什么。因为在该内容上,我们必须完成以下所有操作,我将在 3 小时内回来 我需要控制台窗口的输出来帮助您,而不是一些您认为是 var s 内容的代码 - 我们需要在程序执行期间知道 var s 中的内容以调试和调整您的程序

以上是关于从生成的 <script> 中提取数据并处理结果的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Beautiful Soup 从 <script> 中提取内容

从 html 中的 <script> 标记中提取 var

从 html <script> 中提取 JSON 对象

根据数据生成表单

使用 Scrapy 从 HTML 中的 <script> 标签获取数据

如何从脚本标签中提取字符串数据,其中脚本没有任何 id?