使用 SwiftSoup 获取数组中的所有标签元素

Getting all tag elements in an array with SwiftSoup

我在 python 的一个项目中使用 BeautifulSoup 解析 Html 文档并向每个字符串添加 ruby 和 rt 标签。最近我一直在为个人 IOS 应用程序开发一个类似的项目。我发现 SwiftSoup 很相似,但是 运行 在解析标签时遇到了问题,我可以使用 BeautifulSoup 完美地做到这一点。在 Beautiful soup 中,我可以获得如下标签

<p id="p6" data-pid="6" data-rel-pid="[41]" class="p6">
  <span class="parNum" data-pnum="1"></span>
     This is a(<span id="citationsource2"></span><a epub:type="noteref" href="#citation2">link</a>)to some website。
</p>

使用 BS4 中的 .content 我能够将标签放入这样的数组中

['\n', <span class="parNum" data-pnum="1"></span>, '\n         This is a(', <span id="citationsource2"></span>, <a epub:type="noteref" href="#citation2">link</a>, ')to some website。\n    ']

在我遍历数组并检查子标签是否有文本或数组中的元素是否为文本元素后,我只是附加 ruby 标签。结果是这样

 <p id="p6" data-pid="6" data-rel-pid="[41]" class="p6">
  <span class="parNum" data-pnum="1"></span>
     <ruby>This<rt>1</rt></ruby><ruby>is<rt>2</rt></ruby> <ruby>a<rt>3</rt></ruby>(<span id="citationsource2"></span><a epub:type="noteref" href="#citation2"><ruby>link<rt>4</rt></ruby></a>)<ruby>to<rt>5</rt></ruby> <ruby>some<rt>6</rt></ruby> <ruby>website<rt>7</rt></ruby>。
</p>

我使用 SwiftSoup 解析文档,因为它没有类似 BS4 的方法 .content

let soup:Document = try! SwiftSoup.parse(html)
let elements:Elements = try! soup.select("p")
for j in try! elements.html(){
  
    print(try! j)
   //Doesn't work prints out every single character not every element
}

问题在于它将 p 标签的全部内容视为一个元素,它不像 BS4 那样将 p 标签中的元素分开。我查看了文档,但没有看到任何关于将元素从标签中分离到数组中的内容。

这就是我想用 Swiftsoup 实现的目标

['\n', <span class="parNum" data-pnum="1"></span>, '\n         This is a(', <span id="citationsource2"></span>, <a epub:type="noteref" href="#citation2">link</a>, ')to some website。\n    ']

但最终将所有内容作为数组中的一个元素而不是单独的元素。

[<span class="parNum" data-pnum="1"></span>This is a(<span id="citationsource2"> 
  </span> <a epub:type="noteref" href="#citation2">link</a>)to some website.]

有没有什么方法可以使用 swiftsoup 或其他 swift html 解析器实现同样的目的?

查看 SwiftSoup 文件后,我找到了问题的答案。 SwiftSoup 有一个名为 getChildNodes 的方法,它允许您获取指定标签的所有内容。它 returns 标签内容的数组。希望这对遇到类似问题的人有所帮助。

let soup:Document = try! SwiftSoup.parseBodyFragment(html)
let p : Elements = try! soup.select("p")
for j in p{
    print(try! j.getChildNodes())

}}