【问题标题】:Search results into listbox?搜索结果进入列表框?
【发布时间】:2013-01-18 21:57:01
【问题描述】:
这是我在这里的第一篇文章。之前用过这个网站,最后决定做个账号。
我正在尝试制作一个程序,列出 Google 搜索出现的前 50 个站点中的 url's。我是 VB.net 的初学者,我知道我应该尝试一些更简单的方法,但我真的很想做这个程序。
我的想法是获取 HTML,然后从那里获取到网站的链接,但是当我查看 Google 搜索结果页面的 HTML 时,大部分链接都不存在。于是,我右键点击其中一个结果,发现url's可以在<cite>标签之间找到。
我的问题是:
如何将每个元素的 HTML 转换为字符串?
【问题讨论】:
标签:
html
vb.net
search
listbox
【解决方案1】:
使用HTML Agility Pack 可以大大简化解析HTML 的过程。
这是一个非常基本的实现,可以满足您的需求:
Private Sub DoSearch(query As String)
Dim wc = New WebClient()
wc.DownloadStringAsync(New Uri("http://google.com/search?q=" + query))
AddHandler wc.DownloadStringCompleted, AddressOf ParseResults
End Sub
Private Sub ParseResults(sender As Object, e As DownloadStringCompletedEventArgs)
LvResults.Items.Clear()
If e.Error IsNot Nothing Then
MsgBox(e.Error.Message, MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly)
Exit Sub
End If
Dim htmlDoc As New HtmlAgilityPack.HtmlDocument()
htmlDoc.LoadHtml(e.Result)
For Each node In htmlDoc.DocumentNode.SelectNodes("//h3[@class='r']/a")
Dim item As New ListViewItem(node.InnerText)
item.SubItems.Add(CleanURL(node.Attributes("href").Value))
LvResults.Items.Add(item)
Next
LvResults.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent)
End Sub
Private Function CleanURL(url As String) As String
url = url.Replace("/url?q=", "")
If url.Contains("&") Then url = url.Split("&"c)(0)
Return url
End Function
成功使用 HTML Agility Pack 的诀窍是知道能够生成正确结果的正确 XPath,但这可能很棘手,特别是对于初次使用的用户。
因此,我强烈建议您下载 HAP Testbed 以帮助您测试和试验多个 XPath,直到您获得所需的内容(无需不断调试您的应用程序来测试您的更改)。
如果您愿意,可以下载实现此代码的功能示例:SearchToListView
【解决方案2】:
假设您只关心提取<cite> 和</cite> 之间的内容,您可以通过拆分<cite> 然后从每个项目中删除</cite> 来解析字符串。您还可以从每个项目中删除 <b> 和 </b>。从索引 1 到数组上限的项目应该有你的链接。