35 votes

analyse html des cartes de performance cricinfo

Objectif

Je suis à la recherche de gratter 20/20 cricket de la carte de pointage de données à partir de la Cricinfo site web, idéalement en CSV forme pour l'analyse de données dans Excel

Comme un exemple, actuellement, Australien Big Bash 2011/12 cartes de pointage sont disponibles à partir de

Arrière-plan

Je suis compétent dans l'aide de VBA (soit l'automatisation IE ou à l'aide de XMLHTTP , puis à l'aide d'expressions régulières) pour recueillir des données à partir de sites web, c'est à dire Extraire des valeurs de HTML TD et Tr

Dans cette même question, un commentaire a été posté suggérant analyse html - que je n'avais pas trouvé avant - donc, j'ai pris un coup d'oeil à des questions telles que la RegEx match ouvert à l'exception des balises XHTML autonome tags

Requête

Alors que je pouvais écrire une regex pour analyser le cricket données ci-dessous je voudrais des conseils sur comment je pourrais récupérer de manière efficace à ces résultats d'analyse html.

S'il vous plaît garder à l'esprit que ma préférence est un modèle au format CSV contenant:

  • la date/nom du match
  • L'équipe 1 nom
  • la sortie doit se décharger jusqu'à 11 dossiers pour l'Équipe 1 (enregistrements vides où les joueurs n'ont pas manié la batte, c'est à dire "N'a Pas de chauve-souris")
  • L'équipe 2 nom
  • la sortie doit se décharger jusqu'à 11 dossiers pour l'Équipe 2 (enregistrements vides où les joueurs n'ont pas manié la batte)

Le Nirvana pour moi, ce serait une solution que j'ai pu déployer à l'aide de VBA ou VBscript afin que je puisse automatiser entièrement mon analyse, mais je suppose que je vais avoir à utiliser un autre outil pour analyser le code html.

Exemple de liens de Site et les Données à extraire

cricinfo scorecardsource date

50voto

Siddharth Rout Points 63935

Il existe 2 techniques que j'utilise pour "VBA". Je vais décrire les 1 par un seul.

1) À L'Aide De FireFox / Firebug Addon / Fiddler

2) à l'Aide d'Excel intégré de la facilité à obtenir des données à partir du web

Depuis ce post sera lu par de nombreux donc je vais couvrir même les plus évidentes. N'hésitez pas à sauter n'importe quelle partie, vous savez


1) À L'Aide De FireFox / Firebug Addon / Fiddler


FireFox : http://en.wikipedia.org/wiki/Firefox Téléchargement gratuit (http://www.mozilla.org/en-US/firefox/new/)

Firebug Addon: http://en.wikipedia.org/wiki/Firebug_%28software%29 Téléchargement gratuit (https://addons.mozilla.org/en-US/firefox/addon/firebug/)

Fiddler : http://en.wikipedia.org/wiki/Fiddler_%28software%29 Téléchargement gratuit (http://www.fiddler2.com/fiddler2/)

Une fois que vous avez installé Firefox, installer Firebug l'Addon. Firebug Addon vous permet d'inspecter les différents éléments dans une page web. Par exemple, si vous souhaitez connaître le nom d'un bouton, il suffit de faire un click droit et cliquer sur "Inspecter l'Élément avec Firebug" et il vous donnera tous les détails dont vous aurez besoin pour ce bouton.

enter image description here

Un autre exemple serait de trouver le nom d'une table sur un site web, qui contient les données que vous devez mettre au rebut.

J'utilise Fiddler seulement quand je suis à l'aide de XMLHTTP. Il m'aide à voir l'info exacte étant passé lorsque vous cliquez sur un bouton. En raison de l'augmentation du nombre de BOTS qui racler les sites, la plupart des sites maintenant, pour éviter automatique de la destruction, la capture de votre les coordonnées de la souris et de l'information et de la fiddler vous permet réellement de débogage que l'info est passée. Je ne vais pas entrer dans les détails ici à ce sujet que cette information peut être utilisée à des fins malveillantes.

Maintenant, nous allons prendre un exemple simple sur la façon de gratter l'URL affichée dans votre question

http://www.espncricinfo.com/big-bash-league-2011/engine/match/524915.html

Laissez-moi d'abord de trouver le nom de la table qui a cette info. Faites simplement un clic droit sur le tableau et cliquez sur "Inspecter l'Élément avec Firebug" et il vous donnera le dessous de l'instantané.

enter image description here

Alors maintenant, nous savons que nos données sont stockées dans une table appelée "inningsBat1" Si nous pouvons extraire le contenu de la table dans un fichier Excel, alors nous pouvons certainement travailler avec des données pour effectuer notre analyse. Voici un exemple de code qui provoque le vidage de la table dans la feuille Sheet1

Avant de poursuivre, je vous recommande, la fermeture de tous Excel et le démarrage d'une nouvelle instance.

Lancement VBA et insérer un objet Userform. Placez un bouton de commande et un webcrowser de contrôle. Votre Userform pourrait ressembler à ceci

enter image description here

Collez ce code dans la zone de code objet Userform

Option Explicit

'~~> Set Reference to Microsoft HTML Object Library

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub CommandButton1_Click()
    Dim URL As String
    Dim oSheet As Worksheet

    Set oSheet = Sheets("Sheet1")

    URL = "http://www.espncricinfo.com/big-bash-league-2011/engine/match/524915.html"

    PopulateDataSheets oSheet, URL

    MsgBox "Data Scrapped. Please check " & oSheet.Name
End Sub

Public Sub PopulateDataSheets(wsk As Worksheet, URL As String)
    Dim tbl As HTMLTable
    Dim tr As HTMLTableRow
    Dim insertRow As Long, Row As Long, col As Long

    On Error GoTo whoa

    WebBrowser1.navigate URL

    WaitForWBReady

    Set tbl = WebBrowser1.Document.getElementById("inningsBat1")

    With wsk
        .Cells.Clear

        insertRow = 0
        For Row = 0 To tbl.Rows.Length - 1
            Set tr = tbl.Rows(Row)
            If Trim(tr.innerText) <> "" Then
                If tr.Cells.Length > 2 Then
                    If tr.Cells(1).innerText <> "Total" Then
                        insertRow = insertRow + 1
                        For col = 0 To tr.Cells.Length - 1
                            .Cells(insertRow, col + 1) = tr.Cells(col).innerText
                        Next
                    End If
                End If
            End If
        Next
    End With
whoa:
    Unload Me
End Sub

Private Sub Wait(ByVal nSec As Long)
    nSec = nSec + Timer
    While Timer < nSec
       DoEvents
        Sleep 100
    Wend
End Sub

Private Sub WaitForWBReady()
    Wait 1
    While WebBrowser1.ReadyState <> 4
        Wait 3
    Wend
End Sub

Lancez maintenant votre formulaire et cliquez sur le bouton de Commande. Vous remarquerez que les données sont sous-évaluées dans la feuille Sheet1. Voir instantané

enter image description here

De même, vous pouvez gratter les autres informations aussi bien.


2) à l'Aide d'Excel intégré de la facilité à obtenir des données à partir du web


Je crois que vous utilisez Excel 2007, donc je vais prendre cela comme un exemple à gratter de la mentionnés ci-dessus lien.

Accédez à la feuille Sheet2. Maintenant, accédez à l'Onglet Données, puis cliquez sur le bouton "Web" sur l'extrême droite. Voir instantané.

enter image description here

Entrez l'url dans la "Nouvelle Fenêtre de Requête Web" et cliquez sur "Go"

Une fois que la page est téléchargée, sélectionnez la table que vous souhaitez importer en cliquant sur la petite flèche comme illustré dans la capture d'écran. Une fois fait, cliquez sur "Importer"

enter image description here

Excel vous demande où vous souhaitez que les données à importer. Sélectionnez la cellule et cliquez sur OK. Et vous avez terminé! Les données seront importées dans la cellule spécifiée.

Si vous le souhaitez, vous pouvez enregistrer une macro, et d'automatiser cette ainsi :)

Voici la macro que j'ai enregistré.

Sub Macro1()
    With ActiveSheet.QueryTables.Add(Connection:= _
    "URL;http://www.espncricinfo.com/big-bash-league-2011/engine/match/524915.html" _
    , Destination:=Range("$A$1"))
        .Name = "524915"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingNone
        .WebTables = """inningsBat1"""
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
End Sub

Espérons que cette aide. Laissez-moi savoir si vous avez encore quelques questions.

Sid

9voto

brettdj Points 26353

Pour toute autre personne intéressée dans ce j'ai fini à l'aide du code ci-dessous en fonction Siddhart de la Déroute de la précédente réponse

  • XMLHttp était significativement plus rapide que l'automatisation IE
  • le code génère un fichier CSV pour chaque série à être téléchargé (tenue à l' X variable)
  • le code décharges chaque match régulier de 29 ligne gamme (quel que soit le nombre de joueurs a manié la batte) à facillitate faciliter l'analyse ultérieure sur

enter image description here

    Public Sub PopulateDataSheets_XML()
    Dim URL As String
    Dim ws As Worksheet

    Dim lngRow As Long
    Dim lngRecords As Long
    Dim lngWrite As Long
    Dim lngSpare As Long
    Dim lngInnings As Long
    Dim lngRow1 As Long
    Dim X(1 To 15, 1 To 4) As String

    Dim objFSO As Object
    Dim objTF As Object

    Dim xmlHttp As Object
    Dim htmldoc As HTMLDocument
    Dim htmlbody As htmlbody
    Dim tbl As HTMLTable
    Dim tr As HTMLTableRow
    Dim strInnings As String

    s = Timer()

    Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP")
    Set objFSO = CreateObject("scripting.filesystemobject")

    X(1, 1) = "http://www.espncricinfo.com/indian-premier-league-2011/engine/match/"
    X(1, 2) = 501198
    X(1, 3) = 501271
    X(1, 4) = "indian-premier-league-2011"
    X(2, 1) = "http://www.espncricinfo.com/big-bash-league-2011/engine/match/"
    X(2, 2) = 524915
    X(2, 3) = 524945
    X(2, 4) = "big-bash-league-2011"
    X(3, 1) = "http://www.espncricinfo.com/ausdomestic-2010/engine/match/"
    X(3, 2) = 461028
    X(3, 3) = 461047
    X(3, 4) = "big-bash-league-2010"

    Set htmldoc = New HTMLDocument
    Set htmlbody = htmldoc.body


    For lngRow = 1 To UBound(X, 1)
        If Len(X(lngRow, 1)) = 0 Then Exit For
        Set objTF = objFSO.createtextfile("c:\temp\" & X(lngRow, 4) & ".csv")

        For lngRecords = X(lngRow, 2) To X(lngRow, 3)
            URL = X(lngRow, 1) & lngRecords & ".html"

            xmlHttp.Open "GET", URL
            xmlHttp.send
            Do While xmlHttp.Status <> 200
                DoEvents
            Loop
            htmlbody.innerHTML = xmlHttp.responseText

            objTF.writeline X(lngRow, 1) & lngRecords & ".html"
            For lngInnings = 1 To 2
            strInnings = "Innings " & lngInnings
                objTF.writeline strInnings

                Set tbl = Nothing
                On Error Resume Next
                Set tbl = htmlbody.Document.getElementById("inningsBat" & lngInnings)
                On Error GoTo 0
                If Not tbl Is Nothing Then
                    lngWrite = 0
                    For lngRow1 = 0 To tbl.Rows.Length - 1
                        Set tr = tbl.Rows(lngRow1)
                        If Trim(tr.innerText) <> vbNewLine Then
                            If tr.Cells.Length > 2 Then
                                If tr.Cells(1).innerText <> "Extras" Then
                                    If Len(tr.Cells(1).innerText) > 0 Then
                                        objTF.writeline strInnings & "-" & lngWrite & "," & Trim(tr.Cells(1).innerText) & "," & Trim(tr.Cells(3).innerText)
                                        lngWrite = lngWrite + 1
                                    End If
                                Else
                                    objTF.writeline strInnings & "-" & lngWrite & "," & Trim(tr.Cells(1).innerText) & "," & Trim(tr.Cells(3).innerText)
                                    lngWrite = lngWrite + 1
                                    Exit For
                                End If
                            End If
                        End If
                    Next
                    For lngSpare = 12 To lngWrite Step -1
                        objTF.writeline strInnings & "-" & lngWrite + (12 - lngSpare)
                    Next
                Else
                    For lngSpare = 1 To 13
                        objTF.writeline strInnings & "-" & lngWrite + (12 - lngSpare)
                    Next
                End If
            Next
        Next
    Next
    'Call ConsolidateSheets
End Sub

2voto

Babak Naffas Points 7219

RegEx n'est pas une solution complète pour l'analyse HTML car il n'est pas garanti d'être régulier.

Vous devez utiliser le HtmlAgilityPack pour interroger le HTML. Cela vous permettra d'utiliser les sélecteurs CSS pour interroger le code HTML comme vous le faites avec jQuery.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X