0

我在 python 中使用 BeautifulSoup 来解析 Html 文档并将 ruby​​ 和 rt 标签添加到每个字符串中。最近我一直在为个人 IOS 应用程序开发一个类似的项目。我发现 SwiftSoup 很相似,但在解析标签时遇到了问题,我可以使用 BeautifulSoup 很好地完成该标签。在美丽的汤中,我可以得到一个像下面这样的标签

<p id="p6" data-pid="6" data-rel-pid="[41]" class="p6">
  <span class="parNum" data-pnum="1"></span>
     This is a(&lt;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>(&lt;span id="citationsource2"></span><a epub:type="noteref" href="#citation2"><ruby>link<rt>4</rt></ruby></a>)&lt;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(&lt;span id="citationsource2"> 
  </span> <a epub:type="noteref" href="#citation2">link</a>)to some website.]

有什么方法可以使用 swiftsoup 或其他可以实现相同目的的 swift html 解析器来实现这一点?

4

1 回答 1

0

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

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

}}
于 2022-01-13T01:57:52.463 回答