我在VS2008中开发了一个Web应用程序。它在我的开发PC上完美运行。当我发布并上传到共享Windows主机服务(支持ASP.NET 3.5)时,它会失败(即使从我的开发PC访问它)。错误消息是:
无法加载文件或程序集“Microsoft.mshtml,Version = 7.0.3300.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a”或其依赖项之一。系统找不到指定的文件。
我已经阅读了很多关于这个主题的论坛帖子,并尝试了推荐的解决方案:
我知道此问题已经涵盖过,但建议的解决方案不起作用。有没有人有任何见解?
TIA
答案 0 :(得分:1)
如果您尝试解析HTML而不是MSHTML,请尝试HTMLAgilityPack或此问题中提到的其他建议
答案 1 :(得分:0)
再次感谢杰森。 HTMLAgilityPack就是这个伎俩。
为了帮助他人,我会发布一些我觉得有用的代码片段(因为该产品的文档很少)。
1)在您的ASP.NET应用程序中,将HtmlAgilityPack.dll和HtmlAgilityPack.XML复制到您的BIN文件夹中。
通过右键单击解决方案资源管理器中的顶行并查看“属性页”来检查是否已注册。如果HtmlAgilityPack不在您的引用中,请单击[AddDownArrow],Add Reference,Bin,HtmlAgilityPack,OK。
2)捕获网页并将其转换为HTML DOC:
改编自EggheadCafe's excellent Asynchronous Task example:
Public Function OnBegin(...)
vRequest = WebRequest.Create("http://www.stackoverflow.com")
Return vRequest.BeginGetResponse(cb, extraData)
End Function
Public Sub OnEnd(...)
Private vPage_Text As String = ""
Private vPage_Doc As New HtmlAgilityPack.HtmlDocument
Using response As WebResponse = vRequest.EndGetResponse(ar)
Using reader As StreamReader = New StreamReader(response.GetResponseStream())
vPage_Text = reader.ReadToEnd()
vPage_Doc.LoadHtml(vPage_Text)
End Using
End Using
End Sub
3)提取整个HTML文档:
vText = vPage_Doc.DocumentNode.OuterHtml
4)检查DOC中的每个链接并收集URL:
For Each vLinkNode As HtmlAgilityPack.HtmlNode In vPage_Doc.DocumentNode.SelectNodes(".//a")
vLinkList = vLinkList & vLinkNode.GetAttributeValue("href", "") & vbCrLf
Next
5)每次检查CSS class =“item_class”并收集文字:
For Each vDivNode As HtmlAgilityPack.HtmlNode In vPage_Doc.DocumentNode.SelectNodes(".//div[@class='item_class']")
vPageText = vPageText & vDivNode.InnerText & vbCrLf
Next
6)提取DOC的标题和说明:
Dim vTitleNode As HtmlAgilityPack.HtmlNode = vPage_Doc.DocumentNode.SelectSingleNode(".//title")
vTitleText = vTitleNode.InnerText
Dim vDescriptionNode As HtmlAgilityPack.HtmlNode = vPage_Doc.DocumentNode.SelectSingleNode(".//meta[@name='description']")
vDescriptionText = vDescriptionNode.InnerText
或者文档正文中的标题:
vBodyTitle = vPage_Doc.DocumentNode.SelectSingleNode(".//h1")
7)通过其ID提取元素:
Dim vBigImageNode As HtmlAgilityPack.HtmlNode = vPage_Doc.GetElementbyId("BigImage")
vImage_URL = vBigImageNode.GetAttributeValue("src", "")
vImage_Height = vBigImageNode.GetAttributeValue("height", "")
vImage_Width = vBigImageNode.GetAttributeValue("width", "")
8)删除节点:
vMovieNode.SelectSingleNode(".//div[@class='viewer-reviews']").Remove()
最后,当没有明显的节点或其他“附着点”时,我需要提取页面的子部分。诀窍是识别可以“找到”的任何内容(例如标记或注释),这些内容可以用作文档已经选定的节点中的分界点。然后插入插入结束标记和开始标记,从而创建2个带有节点的独立子部分。最后,从已编辑的节点创建一个新的HTML文档,然后选择新定义的节点。 (如果您不理解所有这些,请遵循代码。)
所以这是最绝密的,从未发布过,
9)提取文件的任何部分:
Dim vNewDoc As New HtmlAgilityPack.HtmlDocument
vNewDoc.LoadHtml(vOldDivNode.OuterHtml.Substring(0, vOldDivNode.OuterHtml.IndexOf("<!-- comment") - 1) & _
"</div><div class=""my_new_node"">" & _
vOldDivNode.OuterHtml.Substring(vOldDivNode.OuterHtml.IndexOf("<!-- comment") - 1))
Dim vNewDivNode = vNewDoc.SelectSingleNode(".//div[@class='my_new_node']")
Dim vHaHaICapturedYou As String = vNewDivNode.InnerText
当然,既然我告诉过你,我就要杀了你。
感谢Stack Overflow的所有贡献者为您提供的所有帮助!