0

我正在尝试在我的应用程序中获取亚马逊产品的图像。我在浏览器中检查了图像,发现它们class-Namegc-design-img-preview. 实际上Elements同一个班级还有更多,所以我只尝试了第一个。

这是我尝试过的:

func getAmazonImage(doc: Document) -> String {
    let images: Elements? = try? doc.getElementsByClass("gc-design-img-preview")
    
    guard (images?.first()) != nil else { return "nope" }
        
    guard  let imageUrl : String = try! images?.first()!.text() else { return "nope2" }
    
    print("image: " + imageUrl)
    
    return imageUrl
}

然而,这并没有返回任何东西,而只是返回一个空的String......我在这里错过了什么?我正在使用SwiftSoup,也许还有另一种方法可以做到这一点?

更新:

我认为这是我需要的,但在Swift

const imgSrc = document.querySelector('li.image.item.itemNo0.maintain-height.selected img').getAttribute('src')

console.log(imgSrc) // https://images-na.ssl-images-amazon.com/images/I/71y%2BUGuJl5L._SX522_.jpg
4

4 回答 4

1

用 SwiftSoup 做到这一点:

import UIKit
import SwiftSoup

class ViewController: UIViewController {

func getProductImage(url: URL)-> String{
    var result = ""
    do {
        let html = try String(contentsOf: url, encoding: .utf8)
        let doc: Document = try SwiftSoup.parseBodyFragment(html)
        let img: Element = try doc.select("li.image.item.itemNo0.maintain-height.selected img").first()!
        
        let imgOuterHtml: String = try img.outerHtml();
       
        let chunks = imgOuterHtml.components(separatedBy: "\"")

        result = chunks[5]
    }
    catch {
       print(error)
    }
    
    return result
}


override func viewDidLoad() {
    super.viewDidLoad()
    guard let url = URL(string: "https://www.amazon.com/dp/B08FC6C75Y") else {
        fatalError("Can not get url")
    }
     let imgUrl = getProductImage(url: url)
     print(imgUrl)  // https://images-na.ssl-images-amazon.com/images/I/61o7ai%2BYDoL._SL1441_.jpg
  }
 }
于 2021-01-06T20:31:16.670 回答
0

更新 XCode 后,我可以再次调试:

此代码在两个网址中都可以正常工作:

import UIKit
import SwiftSoup

class ViewController: UIViewController {

func getProductImage(url: URL)-> String{
    var result = ""
    do {
        let html = try String(contentsOf: url, encoding: .utf8)
        let doc: Document = try SwiftSoup.parseBodyFragment(html)
        let img: Element = try doc.select("li.image.item.itemNo0.maintain-height.selected img").first()!
        let imgOuterHtml: String = try img.outerHtml();
        let imgUrl = getImageUrl(imgOuterHtml)
        result = imgUrl
    }
    catch {
        print(error)
    }
    return result
}

func getImageUrl(_ input: String)->String{
    let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
    let matches = detector.matches(in: input, options: [], range: NSRange(location: 0, length: input.utf16.count))
    
    guard let range = Range(matches[0].range, in: input) else { fatalError("Can not get range") }
    let url = input[range]
    
    return String(url).components(separatedBy: "&")[0]
}

override func viewDidLoad() {
    super.viewDidLoad()
    
    //guard let url = URL(string: "https://www.amazon.com/dp/B08FC6C75Y") else {
    guard let url = URL(string: "https://www.amazon.com/dp/B0084DS9EE") else {
        fatalError("Can not get url")
    }
    let imgUrl = getProductImage(url: url)
    //print(imgUrl)// https://images-na.ssl-images-amazon.com/images/I/61o7ai%2BYDoL._SL1441_.jpg
    print(imgUrl)  // https://images-na.ssl-images-amazon.com/images/I/41ZmuuKMtmL._SY450_.jpg
 }
}
于 2021-01-06T23:41:17.747 回答
0

例如,在此网址中: https ://www.amazon.com/DualSense-Wireless-Controller-PlayStation-5/dp/B08FC6C75Y/ref=sr_1_1?dchild=1&fst=as%3Aoff&pf_rd_i=16225016011&pf_rd_m=ATVPDKIKX0DER&pf_rd_p=03b28c2c-71e9 -4947-aa06-f8b5dc8bf880&pf_rd_r=CSWVBS40MDKKJYXEJ0AH&pf_rd_s=merchandised-search-3&pf_rd_t=101&qid=1489016289&rnid=16225016011&s=videogames-intl-ship&sr=1-1

const imgSrc = document.querySelector('li.image.item.itemNo0.maintain-height.selected img').getAttribute('src')

console.log(imgSrc) // https://images-na.ssl-images-amazon.com/images/I/71y%2BUGuJl5L._SX522_.jpg
于 2021-01-06T01:28:05.010 回答
0

对于第二个 url,图像可以以不同的分辨率获得,您可以从不同的属性 data-midres-replacement、data-zoom-hires 或 data-a-hires 获得它,在代码中是所有选项,但其中一些被评论。

import UIKit
import SwiftSoup

class ViewController: UIViewController {

func getProductImage(url: URL)-> String{
    var result = ""
    do {
        let html = try String(contentsOf: url, encoding: .utf8)
        let doc: Document = try SwiftSoup.parseBodyFragment(html)
                                            
        let img: Element = try doc.select(".image-size-wrapper.fp-image-wrapper.image-block-display-flex img").first()!  
        let src  = try img.attr("src")  

        if src.contains("data:image/gif;base64"){
            
            let dataMidresReplacement  = try img.attr("data-midres-replacement")
            print("dataMidresReplacement: \(dataMidresReplacement)") // dataMidresReplacement: https://images-na.ssl-images-amazon.com/images/I/41ZmuuKMtmL._AC_SY350_.jpg
            result = dataMidresReplacement
            /*
            let dataZoomHires  = try img.attr("data-zoom-hires")
            print("dataZoomHires: \(dataZoomHires)") // dataZoomHires: https://images-na.ssl-images-amazon.com/images/I/41ZmuuKMtmL._AC_SL1500_.jpg
            result = dataZoomHires
            */
            /*
            let dataHires  = try img.attr("data-a-hires")
            print("dataHires: \(dataHires)") // dataHires: https://images-na.ssl-images-amazon.com/images/I/41ZmuuKMtmL._AC_SY1000_.jpg
            result = dataHires
            */
        } else {
            result = src
        }
    }
    catch {
        print(error)
    }
    
    return result
}

override func viewDidLoad() {
    super.viewDidLoad()
    
   //guard let url = URL(string: "https://www.amazon.com/dp/B08FC6C75Y") else {
   guard let url = URL(string: "https://www.amazon.com/dp/B0084DS9EE") else {
        fatalError("Can not get url")
    }
    let imgUrl = getProductImage(url: url)
    //print(imgUrl) // https://images-na.ssl-images-amazon.com/images/I/61o7ai%2BYDoL._AC_SY350_QL15_.jpg
    print(imgUrl)  // data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
   }
}
于 2021-01-21T17:41:03.367 回答