我有以下html:
<div id = "big">
<span>header 1</span>
<ul id = "outer">
<li id = "inner">aaa</li>
<li id = "inner">bbb</li>
</ul>
<span>header 2</span>
<ul id = "outer">
<li id = "inner">ccc</li>
<li id = "inner">ddd</li>
</ul>
</div>
我希望它按顺序循环播放:
header 1
aaa
bbb
header 2
ccc
ddd
我尝试循环遍历每个 ul,然后打印标题和 li 值。但是,我不知道如何获取与 ul 关联的 span 标头。
sets = tree.xpath("//div[@id='big']//ul[@id='outer']")
for set in sets:
# Print header. Not sure how to get it
header = set.xpath(".//li/preceding-sibling::span")
print header
# Print texts. This works.
values = set.xpath(".//li//text()")
for v in values:
print v
仅循环所有文本节点是行不通的,因为我需要知道它是标题还是 li 值。
这有效:
header = ingred_set.getprevious().xpath(".//text()")[0]
对于 HTML,请使用 BeautifulSoup。它让您可以直接访问上一个和下一个兄弟姐妹:
sibling_soup.b.next_sibling
# <c>text2</c>
sibling_soup.c.previous_sibling
# <b>text1</b>
此外,你可以告诉 BS 在
constructor中使用
lxml
解析器。从实践中我可以看出,在格式不正确的输入中,lxml
比默认的html.parser
表现更好