【问题标题】:vb.net Scraping from a Websitevb.net 从网站抓取
【发布时间】:2014-03-29 08:10:58
【问题描述】:

所以我正在尝试从网站上抓取用户名并在此处遵循本教程

https://www.youtube.com/watch?v=FpAvBOhDrYk 第一部分

https://www.youtube.com/watch?src_vid=FpAvBOhDrYk第二部分

并关注了所有内容,但无法使其正常工作,但这是我使用的 vb.net 代码

  1. 导入 System.Text.RegularExpressions

    公开课表1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://statigr.am/tag/anime")
        Dim response As System.Net.HttpWebResponse = Request.GetResponse
    
        Dim rs As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream())
    
        Dim rssourcecode As String = rs.ReadToEnd
    
        '<a href="/hannahotaku">hannahotaku</a>
    
        Dim r As New System.Text.RegularExpressions.Regex("<a href=""/.*"">hannahotaku</a>")
        Dim matches As MatchCollection = r.Matches(rssourcecode)
    
    
        For Each itemcode As Match In matches
            ListBox1.Items.Add(itemcode.Value.Split("""").GetValue(1))
    
        Next
    
    
    End Sub End Class
    

你可以看到我正在使用网站统计图 我试图抓取的来源是这个

<a href="/hannahotaku">hannahotaku</a>

请让我知道我做错了什么,因为我想刮

之间的部分
(<a href="/**whatever username here**"></a>)

【问题讨论】:

  • 尝试使用惰性版本:"&lt;a href=""/.*?""&gt;hannahotaku&lt;/a&gt;"
  • 试过了,列表框中什么也没有出现:/
  • 我刚刚查看了您正在阅读的网站,但没有找到hannahotaku...?
  • 那是因为它每秒更新一次,因为我想抓取页面上的每个用户名。
  • 好吧,我在做一个疯狂的猜测:尝试"&lt;div&gt;&lt;div&gt;([^&lt;]+)&lt;/div&gt;"作为正则表达式并在循环中,而不是itemcode.Value.Split("""").GetValue(1)使用itemcode.Groups(1).Value

标签: regex vb.net scrape


【解决方案1】:

如果你想捕获整个链接:

(<a href="\/.+?">hannahotaku<\/a>)

如果要捕获用户名:

<a href="\/(.+?)">hannahotaku<\/a>

据我所知,VB.net 可能是:

<a href=""/(.+?)"">hannahotaku</a>

使用惰性匹配 (+?) 确保它只匹配所需的内容,没有额外的内容,并使用加号确保其中至少有一些单字母用户名,并且不完全为空。

附:我对vb.net不太熟悉,所以如果有什么需要做的调整,请告诉我。

DEMO

【讨论】:

  • 似乎对我不起作用仍然可能我做错了什么
  • @user3123931 正如您在演示中看到的那样,它可以工作。所以,也许,也许你需要适应你的语言。
  • 您能否将其添加到其余代码中,看看我是否添加错了?谢谢。
  • @user3123931 抱歉,我不能。我对 VB.net 不太熟悉 :)
【解决方案2】:

改用这个正则表达式:

"<div><div>([^<]+)</div>"

在 for 循环中,使用 itemcode.Groups(1).Value 而不是 itemcode.Value.Split("""").GetValue(1)。这将为您提供 div 标签之间的部分。

要检索匹配项,请尝试将它们放入文件中:

Imports System.Text.RegularExpressions

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim Request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://statigr.am/tag/anime")
    Dim response As System.Net.HttpWebResponse = Request.GetResponse

    Dim rs As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream())

    Dim rssourcecode As String = rs.ReadToEnd

    Dim r As New System.Text.RegularExpressions.Regex("<div><div>([^<]+)</div>")
    Dim matches As MatchCollection = r.Matches(rssourcecode)

    Using Dim addInfo = File.CreateText("c:\Textfile.txt")
        For Each itemcode As Match In matches
            addInfo.WriteLine(itemcode.Groups(1).Value)
        Next
    End Using


End Sub End Class

【讨论】:

  • @user3123931 我环顾四周并添加了一些内容以将结果写入文件。告诉我进展如何。
  • 天哪,谢谢它的工作,我也找到了一种方法,几乎​​只是将数据从列表框转移到一个丰富的盒子,但这更好,所以谢谢:)
  • @user3123931 太棒了! :D
猜你喜欢
  • 1970-01-01
  • 2014-07-06
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多