दिलचस्प पोस्ट
स्क्रॉल करते समय एक UITableViewCell के निर्देशांक निर्धारित करें लॉक-डाउन iPhone / iPod / iPad इसलिए यह केवल एक ऐप चला सकता है होस्ट के बाहर से डॉक करने वाले कंटेनर से कैसे जुड़ें (एक ही नेटवर्क) 'पुस्तकालय लोड नहीं किया गया है: @ rpath / libcudart.7.5.dylib' मैक पर TensorFlow त्रुटि ऑटो में <div> ऊँचाई उसमें सामग्री के अनुसार समायोजित कैसे करें? C ++ में एक सरणी को सॉर्ट करने के लिए std :: sort का उपयोग कैसे करें $ Sce.trustAsHtml के भीतर प्रतिपादन निर्देश यह देखने के लिए सबसे अच्छा तरीका है कि डेटा तालिका में एक रिक्त मान है या नहीं अपडेट करने वाले डेटा को संक्षिप्त करने के लिए स्क्रिप्ट html5 वीडियो टैग कोडेक्स विशेषता क्या प्रकार के नाम के बाद कोष्ठक नए के साथ एक अंतर बनाते हैं? क्या जावास्क्रिप्ट फ़ाइलों को टाइपस्क्रिप्ट में परिवर्तित करने के लिए कोई औजार है? जावा में मॉकिटो का उपयोग करके नई तिथि (नकली) कैसे नकली है एक स्क्रॉल JTextArea (जावा) जोड़ना Javascript संख्या प्रारूप को सही करने के लिए एक स्ट्रिंग युक्त वैज्ञानिक नोटेशन को कैसे परिवर्तित करें

क्रिकइन्फो स्कोरकार्ड की html पार्सिंग

लक्ष्य

मैं क्रिकइन्फो वेबसाइट से 20/20 क्रिकेट स्कोरकार्ड डेटा को स्क्रैप करने के लिए देख रहा हूं, आदर्श रूप में Excel में डेटा विश्लेषण के लिए सीएसवी फॉर्म में

एक उदाहरण के रूप में वर्तमान ऑस्ट्रेलियाई बिग बैश 2011/12 स्कोरकार्ड उपलब्ध हैं

  • गेम 1: http://www.espncricinfo.com/big-bash-league-2011/engine/match/524915.html
  • अंतिम गेम: http://www.espncricinfo.com/big-bash-league-2011/engine/match/524935.html

पृष्ठभूमि

मैं वेबसाइटों से डेटा स्क्रैप करने के लिए VBA (या तो स्वचालित IE या XMLHTTP का उपयोग करके और फिर नियमित अभिव्यक्ति का उपयोग कर) में प्रवीण हूँ, अर्थात एचटीएमएल टीडी और ट्र से एक्सट्रैक्ट वैल्यू

उसी सवाल में एक टिप्पणी एचटीएमएल पार्सिंग का सुझाव दे रही थी – जो पहले से ज्यादा नहीं आई थी – इसलिए मैंने एक्सएचटीएमएल स्व-निहित टैग को छोड़कर रेगएक्स मैच के खुले टैग जैसे प्रश्नों पर एक नज़र डाला है

सवाल

जब मैं नीचे क्रिकेट डेटा को पार्स करने के लिए एक regex लिख सकता हूं, तो मैं सलाह चाहूंगा कि मैं इन परिणामों को एचटीएमएल पार्सिंग के साथ कुशल तरीके से कैसे प्राप्त कर सकता हूं।

कृपया ध्यान रखें कि मेरी वरीयता एक पुनरावर्ती सीएसवी प्रारूप है जिसमें शामिल है:

  • मैच की तारीख / नाम
  • टीम 1 का नाम
  • आउटपुट को टीम 1 के लिए 11 रिकॉर्ड्स तक डंप करना चाहिए (खाली रिकॉर्ड्स जहां खिलाड़ियों ने बल्लेबाजी नहीं की, यानी "बैट नॉट" )
  • टीम 2 का नाम
  • आउटपुट को टीम 2 के रिकार्ड रिकॉर्ड के लिए 11 रिकॉर्ड करना चाहिए (रिक्त रिकॉर्ड जहां खिलाड़ियों ने बल्लेबाजी नहीं की है)

मेरे लिए निर्वाण एक समाधान होगा कि मैं वीबीए या वीबीएसक्रिप्ट का उपयोग कर तैनात कर सकता हूं ताकि मैं पूरी तरह से अपने विश्लेषण को स्वचालित कर सकूं, लेकिन मुझे लगता है कि मुझे html पार्स के लिए एक अलग उपकरण का उपयोग करना होगा।

नमूना साइट लिंक और डेटा निकाले जाने के लिए

क्रिकइन्फो स्कोरकार्डस्रोत तिथि

Solutions Collecting From Web of "क्रिकइन्फो स्कोरकार्ड की html पार्सिंग"

वहाँ दो तकनीकों है जो मैं "VBA" के लिए उपयोग कर रहा हूं मैं उन्हें एक के बाद एक का वर्णन करेगा

1) फ़ायरफ़ॉक्स / फायरबग एडन / फिडलर का उपयोग करना

2) वेब से डेटा प्राप्त करने के लिए एक्सेल की इनबिल्ट सुविधा का उपयोग करना

चूंकि यह पोस्ट कई लोगों द्वारा पढ़ी जाएगी इसलिए मैं स्पष्ट रूप से कवर भी करूँगा। कृपया जो कुछ भी आप जानते हैं, छोड़ने के लिए स्वतंत्र महसूस करें


1) फ़ायरफ़ॉक्स / फायरबग एडन / फिडलर का उपयोग करना


फ़ायरफ़ॉक्स: http://en.wikipedia.org/wiki/Firefox मुफ्त डाउनलोड ( http://www.mozilla.org/en-US/firefox/new/ )

फायरबग एडन: http://en.wikipedia.org/wiki/Firebug_%28software%29 निःशुल्क डाउनलोड ( https://addons.mozilla.org/en-US/firefox/addon/firebug/ )

फिडेलर: http://en.wikipedia.org/wiki/Fiddler_%28software%29 निःशुल्क डाउनलोड ( http://www.fiddler2.com/fiddler2/ )

फ़ायरफ़ॉक्स स्थापित करने के बाद, फायरबग ऐडॉन को स्थापित करें फायरबग एदन आपको वेबपेज में विभिन्न तत्वों का निरीक्षण करने देता है। उदाहरण के लिए यदि आप किसी बटन का नाम जानना चाहते हैं, तो बस उस पर राइट क्लिक करें और "एग्लाइन्ट एलिमेंट विथ फायरबग" पर क्लिक करें और यह आपको उस सभी विवरण देगा जो आपको उस बटन के लिए की आवश्यकता होगी।

यहां छवि विवरण दर्ज करें

एक अन्य उदाहरण एक ऐसी वेबसाइट पर एक तालिका का नाम खोजना होगा जिसमें आपको डेटा समाप्त हो जाना चाहिए।

मैं फ़िल्डल का प्रयोग केवल जब मैं XMLHTTP का उपयोग कर रहा हूं जब आप किसी बटन पर क्लिक करते हैं तो यह सही जानकारी देखने में मेरी मदद करता है बीओटीएस की संख्या में बढ़ोतरी की वजह से साइटें, ज्यादातर साइट अब, स्वचालित स्क्रैपिंग को रोकने के लिए, अपने माउस निर्देशांक को कैप्चर करने और उस जानकारी को पारित करने के लिए, जो कि पास की जा रही जानकारी को डीबग करने में आपकी मदद करता है, को निंदा करती है। मैं इसके बारे में अधिक जानकारी नहीं मिलेगा क्योंकि इस जानकारी को दुर्भावनापूर्ण रूप से इस्तेमाल किया जा सकता है

अब हम आपके प्रश्न में पोस्ट किए गए यूआरएल को कैसे स्क्रैप करते हैं, इस पर एक सरल उदाहरण लेते हैं

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

पहले तालिका के नाम को ढूंढें जो कि जानकारी है टेबल पर बस राइट क्लिक करें और "एग्लाइन्ट एलिमेंट विथ फायरबग" पर क्लिक करें और यह आपको नीचे स्नैपशॉट देगा।

यहां छवि विवरण दर्ज करें

तो अब हम जानते हैं कि हमारे डेटा को "डाट बैट 1" नामक एक टेबल में संग्रहित किया गया है, अगर हम उस तालिका की सामग्री को एक्सेल फाइल में निकाल सकते हैं तो हम निश्चित रूप से हमारे विश्लेषण के लिए डेटा के साथ काम कर सकते हैं। यहां नमूना कोड है जो शीट 1 में उस तालिका को डंप देगा

हम आगे बढ़ने से पहले, मैं सुझाएगा, सभी एक्सेल को बंद करना और एक ताजा उदाहरण प्रारंभ करना।

VBA लॉन्च करें और एक 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 

अब अपना यूजरफॉर्म चलाएं और कमांड बटन पर क्लिक करें। आप देखेंगे कि डेटा शीट 1 में छूटेगा स्नैपशॉट देखें

यहां छवि विवरण दर्ज करें

इसी तरह आप अन्य जानकारी भी ठीक से कर सकते हैं।


2) वेब से डेटा प्राप्त करने के लिए एक्सेल की इनबिल्ट सुविधा का उपयोग करना


मेरा मानना ​​है कि आप एक्सेल 2007 का उपयोग कर रहे हैं, इसलिए मैं उपर्युक्त लिंक को परिमार्जन करने के लिए एक उदाहरण के रूप में ले जाऊंगा।

शीट 2 पर नेविगेट करें अब डेटा टैब पर जाएं और चरम दाईं ओर "वेब से" बटन पर क्लिक करें। स्नैपशॉट देखें

यहां छवि विवरण दर्ज करें

"नई वेब क्वेरी विंडो" में यूआरएल दर्ज करें और "गो" पर क्लिक करें

पेज अपलोड हो जाने के बाद, स्नैपशॉट में दिखाए गए छोटे तीर पर क्लिक करके आप प्रासंगिक तालिका का चयन करें। एक बार किया, "आयात" पर क्लिक करें

यहां छवि विवरण दर्ज करें

तब Excel आपको पूछताछ करेगा कि आप कहां डेटा आयात करना चाहते हैं। संबंधित सेल का चयन करें और ठीक पर क्लिक करें। और तुम हो! डेटा जो आपने निर्दिष्ट किया है उस सेल पर आयात किया जाएगा।

यदि आप चाहते हैं कि आप एक मैक्रो रिकॉर्ड कर सकते हैं और इस के साथ-साथ स्वचालित भी कर सकते हैं 🙂

यहां मैक्रो है जो मैंने दर्ज किया था।

 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 

उम्मीद है की यह मदद करेगा। मुझे बताएं कि क्या आपके पास कुछ प्रश्न हैं

सिड

इस में दिलचस्पी किसी और के लिए मैं सिद्धार्थ राउत के पहले उत्तर के आधार पर नीचे दिए गए कोड का उपयोग कर रहा हूं

  • XMLHttp IE स्वचालित से काफी तेज था
  • कोड प्रत्येक सीरीज़ के लिए एक सीएसवी फ़ाइल तैयार करता है ( X चर में आयोजित किया जाता है)
  • कोड प्रत्येक मैच को नियमित 29 पंक्ति सीमा (चाहे कितने खिलाड़ियों की बल्लेबाजी की परवाह किए बिना) के लिए आसान बनाते हैं, बाद में आसान विश्लेषण करने के लिए

यहां छवि विवरण दर्ज करें

  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 

RegEx HTML को पार्स करने के लिए एक पूर्ण समाधान नहीं है क्योंकि यह नियमित होने की गारंटी नहीं है।

HTML का उपयोग करने के लिए आपको HTML एगिलिटीपैक का उपयोग करना चाहिए यह आपको सीएसएस चयनकर्ताओं का इस्तेमाल करने के लिए एचटीएमएल के बारे में जानने के लिए अनुमति देता है जैसा आप jQuery के साथ कैसे करते हैं।