首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swiftsoup解析并不能找到所有HTML类

Swiftsoup解析并不能找到所有HTML类
EN

Stack Overflow用户
提问于 2020-04-26 13:46:39
回答 1查看 623关注 0票数 0

我有一种方法可以用Swiftsoup来解析网站,得到产品的价格:

代码语言:javascript
运行
复制
@objc func actionButtonTapped(){

    let url = "https://www.overkillshop.com/de/c2h4-interstellar-liaison-panelled-zip-up-windbreaker-r001-b012-vanward-black-grey.html"

    let url2 = "https://www.asos.com/de/asos-design/asos-design-schwarzer-backpack-mit-ringdetail-und-kroko-muster/prd/14253083?clr=schwarz&colourWayId=16603012&SearchQuery=&cid=4877"



    do {


        let html: String = getHTMLfromURL(url: url2)
        let doc: Document = try SwiftSoup.parse(html)

        let priceClasses: Elements = try doc.select("[class~=(?i)price]")

        for priceClass: Element in priceClasses.array() {
            let priceText : String = try priceClass.text()
            print(try priceClass.className())
            print("pricetext: \(priceText)")
        }

    } catch Exception.Error(let type, let message) {
        print(message)
    } catch {
        print("error")
    }
}

该方法对于url很好,但是对于url2,它并不是打印所有的classNames,即使它们与regex匹配。这就是实际的价格:

代码语言:javascript
运行
复制
<span data-id="current-price" data-bind="text: priceText(), css: {'product-price-discounted' : isDiscountedPrice }, markAndMeasure: 'pdp:price_displayed'" class="current-price">36,99 €</span>

该函数的输出如下:

产品-价格特价:股票价格-重试-oos

特价:股票价格重试

特价:

它不是打印class=current-price。我的regex出了什么问题,或者为什么它找不到那个class??

编辑:

我发现price实际上并不在HTML of url2中。只有实际打印出来的classes才在里面。原因是什么,我该怎么解决呢?

EN

回答 1

Stack Overflow用户

发布于 2020-04-26 17:45:15

html不是静态的。它会随着时间的推移而改变。如果您向站点的URL发出get请求,您将得到该站点的html的初始值。但是在浏览器上有一个叫做javascript的东西,它可以使页面的HTML随着时间的推移而改变。实际上,这是很常见的:-该站点最初加载的是一些javascript -- javascript (由站点的创建者开发),而不是运行和执行内容--通过调用该javascript调用一些API来动态更改内容

您不能通过HTML抓取基本URL来抓取该内容。

如果你问我怎么做的话,那就是通过查找网站的HTTP请求来获取内容。看看那个API,自己使用那个API。获取数据,并将其存储在我的服务器中。而不是在客户机上,我调用服务器的API来获取数据。而且我也不确定这是否合法。

但是,据我所知,就你上几个问题而言,你不想这么做。

如果您确实需要在客户机上这样做,您可以使用WKWebView,加载页面,等待内容显示,然后通过以下操作获得页面的当前HTML:

代码语言:javascript
运行
复制
webView.evaluateJavaScript("document.documentElement.outerHTML.toString()", 
                           completionHandler: { (html: Any?, error: Error?) in
    print(html)
})

有关这方面的更多信息,请看this answer

我希望这能解决你所有的问题,因为我认为我没有更多的时间来帮助你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61441843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档