【问题标题】:Get data from HTML key-value从 HTML 键值中获取数据
【发布时间】:2018-06-10 16:36:09
【问题描述】:

我想从 HTML 中获取键值。 目前使用 swift soup 按索引获取元素。 如果网站元素索引发生变化,我将无法获取该值。 想根据键检索值 下面是示例 HTML:

<table class="Tbl"><tbody><tr><td colspan="4" style="background-color:#D49F3E"><div class="Val" style="text-align:center;color:#540000">Saturday, December 30, 2017</div></td></tr><tr><td style="width:18%"><div class="Key">Sunrise:</div></td><td style="width:32%"><div class="Val">06:30</div></td><td style="width:18%"><div class="Key">Sunset:</div> </td><td style="width:32%"><div class="Val">17:52</div></td></tr>

我现在的密码是

do{
   let htmlContent = html
    do{
        let doc =  try SwiftSoup.parse(htmlContent as String)
        do{
            let element = try doc.select("[class=Val]").array()
            do{
                let today = try element[0].text()
                let Sunrise = try element[1].text()
                print(today)
                print(Sunrise)
            }catch{
            }
        }catch{
        }
    }catch{
    }
}

请教如何通过钥匙获取阀门

EDIT-1: 试图申请。在代码下方并出现错误。有什么建议吗?

let data = try? Data(contentsOf: url! as URL)
        let html = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!

        do{
            let html1: String = html as String
            let els: Elements = try SwiftSoup.parse(html1).getElementsByClass("Tbl")
            for keyVal: Element in els.array(){
                let keyValText: String = try keyVal.text()
                print(keyValText)
                let components = keyValText
                    .components(separatedBy: .newlines)
                    .filter{
                        !$0.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
                }
                if let index = components.index(where: {$0.contains(find: "Sunrise")}){
                    let sunriseTest = components[components.index(after: index)] //Error : Thread 1: Fatal error: Index out of range
                    print("sunriseTest: ", sunriseTest)
                }else{

                }
            }

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

【问题讨论】:

  • 你可以将你的 html 转换为字符串 "Saturday, December 30, 2017\nSunrise:\n06:30\nSunset:\n17:52\n" 并得到由 newLines 分隔的组件
  • 您能否发布一个示例,说明“索引更改”时您的 html 字符串的外观?
  • 示例 html,如果索引更改 &lt;table class="Tbl"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="4" style="background-color:#D49F3E"&gt;&lt;div class="Val" style="text-align:center;color:#540000"&gt;Saturday, December 30, 2017&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="width:18%"&gt;&lt;div class="Key"&gt;Sunrise:&lt;/div&gt;&lt;/td&gt;&lt;td style="width:32%"&gt;&lt;div class="Val"&gt;06:30&lt;/div&gt;&lt;/td&gt;&lt;td style="width:18%"&gt;&lt;div class="Key"&gt;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td style="width:32%"&gt;&lt;div class="Val"&gt;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td style="width:18%"&gt;&lt;div class="Key"&gt;Sunset:&lt;/div&gt; &lt;/td&gt;&lt;td style="width:32%"&gt;&lt;div class="Val"&gt;17:52&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

标签: html swift key-value


【解决方案1】:

您可以将您的 html 转换为字符串,并让组件由 newLines 分隔。要修复索引问题,只需过滤修剪空白后为空的行:

struct Sun {
    let date: String
    let sunset: String
    let sunrise: String
    init?(string: String) {
        guard string.count > 4 else { return nil }
        let components = string
            .components(separatedBy: .newlines)
            .filter {
                !$0.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
        }
        date = components[0]
        sunset = components[2]
        sunrise = components[4]
    }
    init?(data: Data) throws {
        self.init(string: try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil).string)
    }
}

游乐场测试:

let html1 = """
<table class="Tbl"><tbody><tr><td colspan="4" style="background-color:#D49F3E"><div class="Val" style="text-align:center;color:#540000">Saturday, December 30, 2017</div></td></tr><tr><td style="width:18%"><div class="Key">Sunrise:</div></td><td style="width:32%"><div class="Val">06:30</div></td><td style="width:18%"><div class="Key">Sunset:</div> </td><td style="width:32%"><div class="Val">17:52</div></td></tr>
"""
let html2 = """
<table class="Tbl"><tbody><tr><td colspan="4" style="background-color:#D49F3E"><div class="Val" style="text-align:center;color:#540000">Saturday, December 30, 2017</div></td></tr><tr><td style="width:18%"><div class="Key">Sunrise:</div></td><td style="width:32%"><div class="Val">06:30</div></td><td style="width:18%"><div class="Key">&nbsp;</div></td><td style="width:32%"><div class="Val">&nbsp;</div></td><td style="width:18%"><div class="Key">Sunset:</div> </td><td style="width:32%"><div class="Val">17:52</div></td></tr>
"""

do {
    if let sun = try Sun(data: Data(html2.utf8)) {
        print("Today:", sun.date)
        print("Sunset:", sun.sunset)
        print("Sunrise:",sun.sunrise)
    }
} catch {
    print(error)
}

今天:2017 年 12 月 30 日星期六日落:06:30 日出:17:52

【讨论】:

  • 我会试试的。一疑。即使索引顺序发生变化,它会得到键的值吗?
  • 它将按照您在初始化程序中提供的顺序设置属性。如果您认为日落可能会在日出之后出现,最好尝试找到单词 Sunset 的索引并获取下一行
  • if let index = components.index(where: {$0.contains("Sunset")}) { sunset = components[components.index(after: index)] } else { return nil } if let index = components.index(where: {$0.contains("Sunrise")}) { sunrise = components[components.index(after: index)] } else { return nil }
猜你喜欢
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2018-01-23
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多