5

我有以下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 值。

4

2 回答 2

7

这有效:

header = ingred_set.getprevious().xpath(".//text()")[0]
于 2013-04-28T12:08:43.950 回答
0

对于 HTML 使用BeautifulSoup。它使您可以直接访问上一个和下一个兄弟姐妹

sibling_soup.b.next_sibling
# <c>text2</c>

sibling_soup.c.previous_sibling
# <b>text1</b>

此外,您可以告诉 BS 在构造函数中使用lxml解析器。从实践中我可以看出,它在格式错误的输入上比默认的表现更好lxmlhtml.parser

于 2013-04-28T12:27:06.743 回答