Разделить строку HTML между строками Swift - PullRequest
0 голосов
/ 06 мая 2018

Можно ли взять только часть строки HTML, которую я получил, передавая URL?

Пример кода ниже:

  let myURLString = "https://myUrl.something"
        guard let myURL = NSURL(string: myURLString) else {
            print("Error: \(myURLString) doesn't seem to be a valid URL")
            return
        }
        do {
            let myHTMLString = try String(contentsOf: myURL as URL)
            let htmlString = String(myHTMLString)
            print("HTML: \(myHTMLString)")
        } catch let error as NSError {
            print("Error: \(error)")
        }

Я хочу взять то, что находится внутри тега <h3 class="post-title"> до </h3>.

Я знаю, что мне следует использовать регулярные выражения, но я не знаю, как правильно их настроить. Я пробовал что-то вроде этого:

  let myURLString = "https://www.fvgtech.it/category/podcast/"
        guard let myURL = NSURL(string: myURLString) else {
            print("Error: \(myURLString) doesn't seem to be a valid URL")
            return
        }
        do {
            let myHTMLString = try String(contentsOf: myURL as URL)
            let htmlString = String(myHTMLString)

            if let match = htmlString.range(of: "(<h3.+)", options: .regularExpression) {
                print("Found",htmlString.substring(with: match))
            }


            print("HTML: \(myHTMLString)")
        } catch let error as NSError {
            print("Error: \(error)")
        }

Но он печатает только <h3 class="post-title">, а не то, что посередине. Заранее спасибо!

1 Ответ

0 голосов
/ 06 мая 2018

Просто нам нужно найти все подстроки между начальной строкой и конечной строкой. См. Расширение строки

 let myURLString = "https://www.fvgtech.it/category/podcast/"
    guard let myURL = NSURL(string: myURLString) else {
        print("Error: \(myURLString) doesn't seem to be a valid URL")
        return
    }
    do {
        let myHTMLString = try String(contentsOf: myURL as URL)
        let htmlString = String(myHTMLString)
        print(htmlString.allStringsBetween("<h3 class=\"post-title\">", andString: "</h3>"))

    } catch let error as NSError {
        print("Error: \(error)")
    }

расширение строки

extension String{

  func allStringsBetween(start: String, end: String) -> [Any] {
            var strings = [Any]()
            var startRange: NSRange = (self as NSString).range(of: start)

            while true {
                if startRange.location != NSNotFound {
                    var targetRange = NSRange()
                    targetRange.location = startRange.location + startRange.length
                    targetRange.length = self.count - targetRange.location
                    let endRange: NSRange = (self as NSString).range(of: end, options: [], range: targetRange)
                    if endRange.location != NSNotFound {
                        targetRange.length = endRange.location - targetRange.location
                        strings.append((self as NSString).substring(with: targetRange))
                        var restOfString =  NSRange()
                        restOfString.location = endRange.location + endRange.length
                        restOfString.length = self.count - restOfString.location
                        startRange = (self as NSString).range(of: start, options: [], range: restOfString)
                    }
                    else {
                        break
                    }
                }
                else {
                    break
                }

            }
            return strings
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...