【问题标题】:Getting special div class data while parsing html in swift with Kanna使用 Kanna 快速解析 html 时获取特殊的 div 类数据
【发布时间】:2018-01-12 18:06:57
【问题描述】:

Google 图片搜索返回如下结果链接:

<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 数据吗?有没有办法用 Kanna 获得“ou”字段? 谢谢。


编辑: 生成 html 以测试 xpath 表达式的示例如下:

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

编辑2:

好的,虽然 Adrians 的回答似乎正确捕获了“ou”字段中的 json 数据,但我的代码仍然无法按预期工作,我进行了更多调试:

正如我现在所看到的,我的主要问题似乎是我打算捕获的 div 类没有被 Alamofire 下载。似乎这是因为这不在 google 返回的 html 正文中,而是在我不理解的结构中。可以在搜索结果的源代码中看到。

到目前为止我的测试代码:

    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。

谢谢,

【问题讨论】:

  • 您是否不需要在您的 xpath 表达式中包含“notranslate”(即for item in doc.xpath("//div[@class='rg_meta notranslate']")?只需通过在线 xpath 测试器运行您的表达式并没有得到任何结果
  • 不幸的是,添加 'notranslate' 并没有什么不同。

标签: html swift parsing xpath


【解决方案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"])

【讨论】:

  • 谢谢。代码不能这样编译,我要改:jsonObject(with: (item.text?.data(using: .utf8)!)!反正还是不行,print(item.text)总是nil,所以我猜想json序列化没有任何作用。似乎xpath表达式没有找到正确的div类...
  • 进行了一些调试 - 从未到达 print(item.text) 行。所以 doc.xpath() 是空的,没有任何项目。 xpath 表达式根本找不到 div/class 部分...
  • 我在我的问题中添加了文本“Edit2”。如果有人能指出如何从示例网站下载 整个 数据以便解析特殊 div 类的解决方案,那就太好了,谢谢
  • Google 使用 javascript,它发出异步请求。我不能帮你解析谷歌网站,因为谷歌有这个 api
  • 好的,我现在明白了。我看到解析特殊 div 类的原始问题已回答,尽管我的任务仍未解决(因为我现在看到我无法首先使用 Alamofire 从谷歌下载这个特殊类的代码,可能因为客户端的脚本)。将问题标记为已回答。谢谢
猜你喜欢
  • 1970-01-01
  • 2018-08-19
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多