html - Swiftsoup 解析未找到所有 HTML 类
问题描述
我有一种使用Swiftsoup
go get the price 解析网站的方法:
@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
. 实际价格是这样的:
<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
pricetext:股票价格重试
价格文本:
它不是打印class=current-price
的。我的有问题regex
还是为什么找不到class
?
编辑:
我发现 theprice
实际上不在HTML
of 中url2
。只有classes
实际打印出来的才在里面。这是什么原因,我该如何解决?
解决方案
html不是静态的。它可以随着时间而改变。如果您向站点的 URL 发出 get 请求,您将获得该站点的 html 的初始值。但是在浏览器上,有一个叫做 javascript 的东西,它可以使页面的 HTML 随时间变化。这实际上很常见: - 网站首先加载了一些 javascript - javascript(由网站的创建者开发)然后运行并做一些事情 - 通过该 javascript 调用某些 API 来动态更改内容
您无法通过对基本 URL 的 HTML 抓取来抓取该内容。
如果你问我无论如何我会怎么做,是通过寻找它获取内容的站点的 HTTP 请求。查看那个 API 并自己使用那个 API。获取数据,并将其存储在我的一些服务器中。比在客户端上,我调用服务器的 API 来获取该数据。我也不确定这是否合法。
但是,据我对你最后几个问题的理解,你不想那样做。
如果你真的需要在客户端这样做,你可以使用WKWebView
,加载页面,等待内容显示,然后通过执行以下操作获取页面的当前 HTML:
webView.evaluateJavaScript("document.documentElement.outerHTML.toString()",
completionHandler: { (html: Any?, error: Error?) in
print(html)
})
查看此答案以了解更多信息。
我希望这能解决你所有的问题,因为我想我没有更多的时间来帮助你:D
推荐阅读
- cassandra - 如何仅按主键集中的一列总结 cassandra 计数器分组?
- python - BeautifulSoup:为什么我收到内部服务器错误?
- python - 是否可以使用 Pandas、seaborn 或 Matplotlib 绘制具有箱的上限和下限的条形图
- c# - C#如何从CheckedListBox中删除多个选中项?
- linux - MediaWiki - 限制对命名空间的访问
- excel - 具有 2 个逻辑条件的 Excel 公式
- html - 直接将woff字体嵌入到blogger
- linux - 无法再连接到我的树莓派
- amazon-web-services - AWS CloudFormation 在通过 CLI 部署时无法创建模板
- ios - 使用 URLSession.shared.dataTask 发出 api 请求