2017-05-21 3 views
0

セレンを使用したWebページからテーブルデータを削り取ろうとしました。しかし、それはそのページからすべてのテーブルを解析しますが、私は単一のテーブルが必要です。私はどのように私は単一のテーブルを選択することができますかについてのアイデアを見つけることができません。これは私が試したものです:セレンを使用して単一のテーブルを選択する際に問題が発生する

Sub table_data() 
    Dim driver As New WebDriver 
    Dim tabl As Object, rdata As Object, cdata As Object 

    Set driver = New WebDriver 
    driver.Start "Phantomjs", "https://fantasy.premierleague.com" 
    driver.get "/player-list/" 
    For Each tabl In driver.FindElementsByXPath("//table[@class='ism-table']") 
     For Each rdata In tabl.FindElementsByXPath(".//tr") 
      For Each cdata In rdata.FindElementsByXPath(".//td") 
      y = y + 1 
      Cells(x, y) = cdata.Text 
      Next cdata 
      x = x + 1 
      y = 0 
     Next rdata 
    Next tabl 
End Sub 

私はXHRでやった!最初のテーブルの行が何になると

Sub TableData() 
Dim xmlpage As New XMLHTTP60 
Dim htmldoc As New MSHTML.HTMLDocument 
Dim htmlas As Object, tRow As Object, tCel As Object 

x = 1 
With xmlpage 
    .Open "GET", "https://fantasy.premierleague.com/player-list/", False 
    .send 
    htmldoc.body.innerHTML = .responseText 
End With 
Set htmlas = htmldoc.getElementsByTagName("table")(2) 
For Each tRow In htmlas.Rows 
    For Each tCel In tRow.Cells 
     c = c + 1 
     Cells(x, c) = tCel.innerText 
    Next tCel 
    c = 0 
    x = x + 1 
Next tRow 
End Sub 
+0

あなたはどのテーブルが必要なのでしょうか?あなたはインデックスでそれを得ることができませんか? – PRAISER

+0

あなたの答えはPRAISERありがとうございます。そこには8つのテーブルがあります。誰でもやります。インデックス作成の場合、私はその番号を自分のコードにどこに入れるべきなのか分かりません。 – SIM

答えて

3

あなたは単にForEachループを破ることができる

Sub table_data() 
    Dim driver As New WebDriver 
    Dim tabl As Object, rdata As Object, cdata As Object 

    Set driver = New WebDriver 
    driver.Start "Phantomjs", "https://fantasy.premierleague.com" 
    driver.get "/player-list/" 
    For Each tabl In driver.FindElementsByXPath("//table[@class='ism-table']") 
     For Each rdata In tabl.FindElementsByXPath(".//tr") 
      For Each cdata In rdata.FindElementsByXPath(".//td") 
      y = y + 1 
      Cells(x, y) = cdata.Text 
      Next cdata 
      x = x + 1 
      y = 0 
     Next rdata 
     Goto end_of_for 
    Next tabl 
    end_of_for: 
End Sub 

または単に最初の要素だけを返す必要があり、あなたのFindElementsByXPathdriver.FindElementsByXpath(....)(0)としての最初の要素を取得します。

- (EDIT)

this docsによると、あなたはそれがdriver.FindElementsByXpath(....).Item(4)なりますのでItemsによって正しい値を得ることができる必要があります。

+0

あなたの答えはPRAISERありがとうございます。この方法は私には新しいものです。最初のテーブルを解析します。しかし、もし私が4番目のテーブルを解析したいのであれば、上記で適用した方法で何を変えることができますか?参考までに、インデックスにはエラーが表示されます。私はあなたの2番目の方法を適用することができればそれは素晴らしいだろう! – SIM

+0

あなたは男の兄弟の宝石です。脱帽。あなたは私の一日を作った。 Btw、行は[Set tabl = driver.FindElementsByXPath( "// table [@ class = 'ism-table']")でなければなりません。項目(1)] – SIM

+0

うまくいってうれしいです。 – PRAISER

1

実際には、XHRと分割だけで、Seleniumを使用する必要はありません。以下のコードを見てみましょう:ここ

Option Explicit 

Sub Scrape_premierleague_com() 

    Dim sResponse, j, i, aRows, aCells 

    With CreateObject("MSXML2.XMLHTTP") 
     .Open "GET", "https://fantasy.premierleague.com/player-list/", False 
     .Send 
     sResponse = .responseText 
    End With 
    ThisWorkbook.Sheets(1).Cells.Delete 
    sResponse = Split(Split(sResponse, "<tbody>")(1), "</tbody>", 2)(0) ' 1 - number of the table 
    aRows = Split(sResponse, "<tr>") 
    For j = 1 To UBound(aRows) 
     aCells = Split(aRows(j), "<td>") 
     For i = 1 To UBound(aCells) 
      ThisWorkbook.Sheets(1).Cells(j, i).Value = Split(aCells(i), "</td>", 2)(0) 
     Next 
    Next 
    ThisWorkbook.Sheets(1).Columns.AutoFit 

End Sub 

は私のために出力されます:

output

+0

あなたの甘くて素敵な解決策に感謝します。実際には、私はXHRで最初にやった。私はそれがJavaScriptで暗号化されている場合のテーブルを解析する方法を知る必要があり、今まではセレニウムを使ってテーブルを解析しようとはしなかった。上記の場所は標本であった。しかし、あなたのスタイルは違っていて簡潔です。ありがとう。 – SIM

関連する問題