0

试图从下面的 HTML 中检索:“17,02”:

<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>

我已经尝试在 swift 中使用此代码:

let titles = try doc.getElementsByClass("pv3 pr3 bb b--black-20").array()

但是当我尝试打印出来时,我得到了 nil 。有没有人有任何解决方案或想法?

4

1 回答 1

1

要选择至少属于多个类之一的元素,请用逗号分隔这些类:

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”在 a 的内部查找所有tds 。然后我们知道第二个是我们想要的。因此,我们将结果转换为数组,然后使用下标选择该数组中的第二个元素。trtbodytd[1]

如果您确定只需要 html 文档中的第二个 td ,则可以缩短选择器:

let td: Element = try doc.select("td").array()[1]

如果您想获取td表格中以 "Kr" 开头的所有第二个 s:

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()}

如果你想要这些tds 但没有 "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 的更多文档,请查看此处

于 2018-08-29T20:41:38.170 回答