2017-08-04 6 views
1

Googleの画像検索が返す結果のリンク:カンナで迅速にHTMLを解析中に特別のdivクラスデータを取得

<div class="rg_meta notranslate">{"cb":6,"cl":21,"cr":9,"ct":6,"id":"G9X757bOKIt_dM:","isu":"hitparade.ch","itg":0,"ity":"jpg","oh":300,"ou":"http://streamd.hitparade.ch/cdimages/jennifer_rush-i_come_undone_s.jpg","ow":296,"pt":"Jennifer Rush - I Come Undone - hitparade.ch","rid":"xArn9C5TiVuF9M","rmt":0,"rt":0,"ru":"http://hitparade.ch/song/Jennifer-Rush/I-Come-Undone-1581","s":"Jennifer Rush - I Come Undone","sc":1,"st":"Hitparade.ch","th":226,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcRbLwVl711N3Q93C-SFdj1a1X6CLQIohPbb_8G9eBEJBX_bzQdC","tw":223}</div> 

私が正しく、このdiv要素に(「OU」フィールドに)画像のパスを取得できますか

rg_meta 

スウィフトとカンナ? 私はいくつかの変種を試しました。

// Alamofire.request... 
if let doc = Kanna.HTML(html: html, encoding: String.Encoding.utf8) { 
    for item in doc.xpath("//div[@class='rg_meta']") { 
     print(item.text) 
     print(item["ou"]) 
    } 
} 

ですが、項目は常に空です。 divのこのJsonデータですか?カンナに「オウ」フィールドを手に入れる方法はありますか?おかげさまで


編集: は、XPath式をテストするためのHTMLを生成するための一例は以下のようになります。

https://www.google.com/search?q=jennifer+rush+i+come+undone&gbv=2&tbm=isch 

EDIT2:

OK、Adriansの答えは正しく捉えているようですしながら、私のコードはまだ意図したとおりに動作していない、私はいくつかのより多くのデバッグを行った:

私が今見ているように、私の主な問題は、私がキャプチャしようとしているdivクラスがAlamofireによってダウンロードされていないということです。これは、これは、HTMLの本文にGoogleの返品ではないが、私は理解していない構造体の下にあるという理由が考えられます。検索結果のソースコードでそれを見ることができます。これまで

私のテストコード:

let requestUrl = "https://www.google.com/search?q=jennifer+rush+i+come+undone&gbv=2&tbm=isch" 
    Alamofire.request(requestUrl).responseString { response in 
     print("Request success/charcount: \(response.result.isSuccess) \(response.result.value?.characters.count ?? 0)") 
     if let responseHtml = response.result.value { 
      if let doc = Kanna.HTML(html: responseHtml, encoding: String.Encoding.utf8) { 
       for item in doc.xpath("//div[@class='rg_meta']") { 
        print(item.text ?? "---") 
       } 
      } 
     } 
    } 

出力:

Request success/charcount: true 40830 

40KのHTMLがダウンロードさが、ブラウザで表示したソースコード全体を約600Kでいます。私は特別なdivクラスの検索を行うことができるようにすべてをダウンロードする方法はありますか? 私はまた

Alamofire.request(requestUrl).responseData 

Alamofire.download(requestUrl, to: destination) 

を試してみましたが、すべては40Kのhtmlを返します。

おかげで、

+0

はあなたがdoc.xpath内の項目のために 'すなわち(あなたのXPath式で 'notranslate' を含める必要はありません( "// divの[クラス@ = 'rg_meta notranslate']") '?xpathテスターを使って式を実行しても結果が得られません。 – toddg

+0

'notranslate'を追加しても差はありません。 –

答えて

1
let yourText = "<div class=\"rg_meta notranslate\">{\"cb\":6,\"cl\":21,\"cr\":9,\"ct\":6,\"id\":\"G9X757bOKIt_dM:\",\"isu\":\"hitparade.ch\",\"itg\":0,\"ity\":\"jpg\",\"oh\":300,\"ou\":\"http://streamd.hitparade.ch/cdimages/jennifer_rush-i_come_undone_s.jpg\",\"ow\":296,\"pt\":\"Jennifer Rush - I Come Undone - hitparade.ch\",\"rid\":\"xArn9C5TiVuF9M\",\"rmt\":0,\"rt\":0,\"ru\":\"http://hitparade.ch/song/Jennifer-Rush/I-Come-Undone-1581\",\"s\":\"Jennifer Rush - I Come Undone\",\"sc\":1,\"st\":\"Hitparade.ch\",\"th\":226,\"tu\":\"https://encrypted-tbn0.gstatic.com/images?q\\u003dtbn:ANd9GcRbLwVl711N3Q93C-SFdj1a1X6CLQIohPbb_8G9eBEJBX_bzQdC\",\"tw\":223}</div>" 

// You can use some other method to extract the text from the div 
let rawJson = yourText 
    .components(separatedBy: "<div class=\"rg_meta notranslate\">").last! 
    .components(separatedBy: "</div>").first! 


guard let jsonObject = try? JSONSerialization.jsonObject(with: rawJson.data(using: .utf8)!, options: []), 
    let json = jsonObject as? [AnyHashable : Any] 
else { 
    return 
} 

print(json["ou"]) 
+0

おかげさまで、このコードはコンパイルされません。jsonObject(with:itemとにかく、それはまだ動作しません、print(item.text)は常にnilなので、jsonのシリアライゼーションは私が推測するものとは何の関係もありません。xpath式正しいdivクラスが見つかりません... –

+0

いくつかのデバッグを行った - t彼はラインプリント(item.text)に決して届かない。そのため、doc.xpath()は空で、項目はありません。 xpath式はdiv/classセクションを全く見つけません... –

+0

私は質問に "Edit2"というテキストを追加しました。特定のdivクラスを解析できるようにサンプルのウェブサイトから*全体の*データをダウンロードする方法を解説することができれば、それは素晴らしいことでしょう。 –

関連する問題