Чтобы выбрать элемент, который принадлежит хотя бы одному из множества классов, разделите эти классы запятой:
let tds: [Element] = try doc.select(".pv3, .pr3, .bb, .b--black-20")
Используйте это, чтобы выбрать второе td
:
let doc: Document = try SwiftSoup.parse(html)
let td: Element = try doc.select("tbody tr td").array()[1]
let text: String = try td.text()
Селектор "tbody tr td" ищет все td
внутри tr
внутри tbody
. И тогда мы знаем, что второй td
- это тот, который мы хотим. Итак, мы конвертируем результат в массив, а затем выбираем второй элемент в этом массиве, используя индекс [1]
.
Если вы уверены, что хотите использовать второй тд в своем HTML-документе, то селектор может быть сокращен:
let td: Element = try doc.select("td").array()[1]
Если вы хотите получить все вторые td
с в вашей таблице, текст которых начинается с «Kr»:
let tds: [Element] = try doc.select("tr td").array().filter { try $0.text().starts(with: "Kr ")}
let labels: [String] = try tds.map {try $0.text()}
Если вы хотите текст этих td
s, но без "Kr":
let tds: [Element] = try doc.select("td").array().filter { try $0.text().starts(with: "Kr ")}
let titlesWithoutKr: [String] = try tds.map {try String($0.text().dropFirst(3))}
Вот окончательный код:
do {
let html: String = """
<div class="overflow-auto">
<table class="w-100 tl mb4 mt3 f6" cellspacing="0">
<thead>
<tr>
<th class="fw6 bb b--black-20 tl pb3 pr3 bg-white tl">Kvalitet</th>
<th class="fw6 bb b--black-20 tl pb3 pr3 bg-white tl">Pris inkl. mva.</th>
<th class="fw6 bb b--black-20 tl pb3 pr3 bg-white tl">Endring</th>
<th class="fw6 bb b--black-20 tl pb3 pr3 bg-white tl">Gjeldene fra</th>
</tr>
</thead>
<tbody class="lh-copy">
<tr>
<td class="pv3 pr3 bb b--black-20"><img src="./assets/95 Miles.png" alt="95 Miles"></td>
<td class="pv3 pr3 bb b--black-20">Kr 17,02</td>
<td class="pv3 pr3 bb b--black-20">5 øre</td>
<td class="pv3 pr3 bb b--black-20">24.08.2018</td>
</tr>
</tbody>
<tbody class="lh-copy">
<tr>
<td class="pv3 pr3 bb b--black-20"><img src="./assets/D Miles.png" alt="D Miles"></td>
<td class="pv3 pr3 bb b--black-20">Kr 15,80</td>
<td class="pv3 pr3 bb b--black-20">5 øre</td>
<td class="pv3 pr3 bb b--black-20">24.08.2018</td>
</tr>
</tbody>
<tbody class="lh-copy">
<tr>
<td class="pv3 pr3 bb b--black-20"><img src="./assets/95 Miles Plus.png" alt="95 Miles"></td>
<td class="pv3 pr3 bb b--black-20">Kr 18,01</td>
<td class="pv3 pr3 bb b--black-20">5 øre</td>
<td class="pv3 pr3 bb b--black-20">24.08.2018</td>
</tr>
</tbody>
<tbody class="lh-copy">
<tr>
<td class="pv3 pr3 bb b--black-20"><img src="./assets/D Miles Plus.png" alt="D Miles"></td>
<td class="pv3 pr3 bb b--black-20">Kr 16,79</td>
<td class="pv3 pr3 bb b--black-20">5 øre</td>
<td class="pv3 pr3 bb b--black-20">24.08.2018</td>
</tr>
</tbody>
</table>
</div>
"""
let doc: Document = try SwiftSoup.parse(html)
let tds: [Element] = try doc.select("td").array().filter { try $0.text().starts(with: "Kr ")}
let titlesWithoutKr: [String] = try tds.map {try String($0.text().dropFirst(3))}
print(titlesWithoutKr)
} catch Exception.Error( _, let message) {
print(message)
} catch {
print("error")
}
И это печатает ["17,02", "15,80", "18,01", "16,79"]
.
Для получения дополнительной документации о том, как использовать SwiftSoup, посмотрите здесь .