Swiftsoup解析未找到所有HTML类
我有一种使用Swiftsoup解析未找到所有HTML类,html,ios,swift,css-selectors,swiftsoup,Html,Ios,Swift,Css Selectors,Swiftsoup,我有一种使用Swiftsoupgo获取产品价格的方法来解析网站: @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-d
Swiftsoup
go获取产品价格的方法来解析网站:
@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
,它不会打印所有类名,即使它们与regex
匹配。这就是实际价格:
<span data-id="current-price" data-bind="text: priceText(), css: {'product-price-discounted' : isDiscountedPrice }, markAndMeasure: 'pdp:price_displayed'" class="current-price">36,99 €</span>
36,99€
该函数的输出如下所示:
产品价格文本:
股价下跌
价格文本:
股价重试
价格文本:
它没有打印class=当前价格
。我的regex
有什么问题吗?或者为什么它找不到class
编辑:
我发现price
实际上并不在url2
的HTML
中。只有实际打印出来的类才在内部。原因是什么?我如何解决这个问题?html不是静态的。它可以随着时间的推移而改变。如果您对站点的URL发出get请求,您将获得该站点html的初始值。
但是在浏览器上有一种叫做javascript的东西,它可以使页面的HTML随着时间的推移而改变。事实上,这很常见:
-该站点首先会加载一些javascript
-javascript(由网站的创建者开发)比运行和做其他事情更重要
-通过javascript调用一些API,内容会动态变化
您不能通过HTML抓取基本URL来抓取该内容
如果你问我该怎么做,那就是通过查找网站的HTTP请求来获取内容。看看那个API,然后自己使用那个API。获取数据,并将其存储在我的一些服务器中。
而在客户端,我调用服务器的API来获取数据。
我也不确定这是否合法
但是,据我所知,你的最后两个问题,你不想这样做
如果确实需要在客户端执行此操作,可以使用WKWebView
,加载页面,等待内容显示,然后通过执行以下操作获取页面的当前HTML:
webView.evaluateJavaScript(“document.documentElement.outerHTML.toString()”,
completionHandler:{(html:Any?,error:error?)在
打印(html)
})
更多关于这方面的信息,请参阅
我希望这能解决您所有的问题,因为我想我没有更多的时间来帮助您:D您在[class~=(?I)price]
中使用的是css选择器,而不是正则表达式。哦,对不起,这是问题吗?或者我该怎么解决?谢谢你的帮助。问题是我实际上使用的是ShareExtension
,我从那里获取当前URL并使用它。有没有办法在我的ShareExtension
中调用evaluateJavascript
??