2017-02-14 39 views
1

Googleでvbaを使用して複数のサイトのデータを解析するコードを作成しました。検索が何であれ、タグ要素["h3"と "a"]を削り取ることができます。しかし、私が期待していることがあれば、検索の名前や電話番号を解析したいと思います。助けを前にありがとう。vbaを使用して複数のサイトからデータを掻き集める

Sub GoogleSearch() 
Dim http As New MSXML2.XMLHTTP60, html As New HTMLDocument, hmm As New HTMLDocument 
Dim topics As Object, post As Object, link As Object, posts As Object 
Dim url As String, z As String 
Dim i As Long, LRow As Long 

LRow = Range("A" & Rows.Count).End(xlUp).Row 

For i = 3 To LRow 
url = "https://www.google.co.in/search?q=" & Cells(i, 1) 

http.Open "GET", url, False 
http.setRequestHeader "Content-Type", "text/xml" 
http.send 

html.body.innerHTML = http.responseText 

Set topics = html.getElementById("rso") 
Set post = topics.getElementsByTagName("H3")(0) 
Set link = post.getElementsByTagName("a")(0) 

Cells(i, 2) = link.innerText 
Cells(i, 3) = link.href 
z = link.href 
    http.Open "GET", z, False 
    http.send 
    hmm.body.innerHTML = http.responseText 
    Set posts = hmm.getElementsByClassName("phone") 
    If Not posts(0) Is Nothing Then 
     Cells(i, 4) = posts(0).innerText 
    Else  
     Cells(i, 4).Value = "Phone Not Found" 
    End If 
Next i 
End Sub 

答えて

1

私はグーグルを使って複数のサイトからのデータを解析するためのコードを書いています。

正確ではありません。あなたが書いたものは非常に具体的で柔軟性のないコードで、「電話」クラスが必要です。そうでない場合はエラーが発生します。一度これを行うとhttp.Open "GET", z, Falseは新しいウェブサイトに移動しているので、YellopagesとMcDonaldsが同じ構造でも遠隔で共有するとは信じられません。この時点で、何をやっていることは、単純に(異なる)のウェブサイトがかかる場合があります無限の構造を処理するのに十分な柔軟性ではありません。

http.send 
hmm.body.innerHTML = http.responseText 
Set posts = hmm.getElementsByClassName("phone") 
Cells(i, 4) = posts(0).innerText 

あなたはは、クラス名と要素が存在しなければならないことを想定しているSet posts = hmm...とき= に「電話」あなたが掻き集めるウェブサイト。そのような要素がない場合、エラーが発生します(オブジェクトが必要です)。

  1. あなたは、インデックス付きの呼び出しを使用することができます:あなたはそれを行うことができます任意の要素を取得するために

    は、あなたがスクレーピングしているサイトの構造について何かを知っている必要がありますが、いくつかの方法がありますgetElementsByTagNameまたはgetElementsByClassName(あなたが現在やっていること)に、これはあなたの状態が発見された場合、あなたはExit ForgetElementsByTagNameによって返されるコレクションを反復しながら、いくつかの条件に合致したタグ名やクラス名

  2. を知っている必要があり
  3. お使いのブラウザでサポートされている場合は、getElementByIDを使用できます(IDタグが利用可能な場合、それは一意の識別子です)。
  4. 既知の場合、xpathの識別子を指定できます。
  5. 普通のHTMLソースから電話番号を抽出するために、結果全体を取り込み、正規表現を使用して試してみることができます。この場合、最も信頼できる方法です。

解析対象のウェブページのサンプルソースコードを提供すると、特定の支援をする方が簡単かもしれませんが、さまざまなウェブサイトをスクラップしようとしているため、単一の解決策を得ることはできません。私が行う可能性がありますどのような

、あなたのコメントで次のアップは、このようなものです:

http.Open "GET", z, False 
    http.send 
    hmm.body.innerHTML = http.responseText 

    Set posts = hmm.getElementsByClassName("phone") 
    If posts Is Nothing Then'# This condition is True if no "phone" element exist 
     cells(1,4).Value = "phone not found at " & z 
    Else 
     Cells(i, 4) = posts(0).innerText 
    End If 

Next i 

これは、少なくとも、エラーなしで実行されます、そして、それは「電話」クラスが含まれていないURLを識別します。それらのWebページのソースHTMLを調べることができ、追加のケースを処理するためにコードを変更することができます。

結果全体を摂取し、正規表現を使用してプレーンHTMLソースから電話番号を抽出することができます。この場合、最も信頼できるものです。

+0

お返事ありがとうございました。私はあなたの答えを見るまで、私が一回の呼び出しで必要な情報を得ることについて真剣に混乱していました。さまざまなサイトで、私はここでやったのと同じ質問をする人々に気づいた。この時点で深い掘削の基礎を理解できましたが、forループで推進されるエラーハンドラを作成すると、単一のサブルーチンや呼び出しで最高で5〜10のサイトを削るために働くことができることを知りたいのです。リストに100以上の検索が含まれています。もう一度ありがとうございました。 – SIM

+0

エラーなしで実行される単純なハンドラで小さなリビジョンを作成し、 "phone"クラスが見つからないURLを特定する必要があります。うまくいけば、これはあなたに役立ちます:) –

+0

私の厄介なコードにあなたの種類のタッチのおかげでサー。おそらく、あなたはそれを飛行機に書きました。なぜなら、そこには些細な間違いがあったからです。私はすでにそれを修正しました。 – SIM

関連する問題