提问人:seanlenny 提问时间:11/15/2020 更新时间:11/15/2020 访问量:29
如何分析 <ul> 为同级的无序列表
How to parse unorderd lists where <ul> is sibling
问:
我正在用 cheerio 解析一个 html 文件。
我卡住的部分呈现如下:
Fruit
- Banana
- Ripe
- Rotten
- Apple
Car
但底层 HTML 是出乎意料的
<td>
Fruit
<ul>
<li>Banana</li>
<ul>
<li>Ripe</li>
<li>Rotten</li>
</ul>
<li>Apple</li>
</ul>
Car
</td>
视觉上是 的子项,+ 是 的子项。但是,在底层 html 中,它们是同级的。这就是我的问题开始的地方。Banana
Fruit
Ripe
Rotten
Banana
我的直觉是递归解析它,但是我无法弄清楚如何将“兄弟姐妹”附加为前一个节点的子节点
对上述示例的测试将期望以下输出:
[
{
"text": "Fruit",
"children": [
{
"text": "Banana",
"children": [
{
"text": "Ripe"
},
{
"text": "Rotten"
}
]
},
{
"text": "Apple"
}
]
},
{
"text": "Car"
}
]
我目前的尝试看起来像以下一些变体:
interface Note {
text: string,
children?: Note[]
}
function parseNote(note: cheerio.Cheerio): Note[] {
const notes: Note[] = []
let note: Note
note.contents().each(function parseNoteGroups(): Note {
const element = $(this)[0]
// reached end of note group
if (element.type === 'text') {
if (note.text) {
notes.push(note)
}
note = {text: $(this).text(), children: []}
}
if ($(this).is('li')) {
if (children.length > 0) {
return { text: $(this).text(), children }
}
return { text: $(this).text() }
}
if ($(this).is('ul')) {
$(this).children().each(function () {
children.push(parseNoteGroups.bind(this)())
})
}
})
notes.push(note) // push last note
return notes
}
它有一些问题。但我正在努力在概念上使这项工作。感谢您的阅读,我期待任何建议或解决方案。
答: 暂无答案
评论
ul
ul
<ul><li>Banana<ul><li>Other options....</li></ul></li></ul>