代码之家  ›  专栏  ›  技术社区  ›  fleaheap

如何使用lxml和python遍历html文档及其子文档的<body>

  •  1
  • fleaheap  · 技术社区  · 8 年前

    我想获取一个html文档并遍历 <body> 文档的一部分及其子项。我看到了很多通过xpath或标记名获取子树的示例,但这似乎并没有给孩子们提供。

    import lxml
    from lxml import html, etree  
    
    html3 = "<html><head><title>test<body><h1>page title</h3><p>some text</p>"
    root = lxml.html.fromstring(html3)
    tree = etree.ElementTree(root)
    for el in root.iter():
        # do something
        print(el.text, tree.getpath(el))
    

    这将输出

    None /html
    None /html/head
    test /html/head/title
    None /html/body
    page title /html/body/h1
    some text /html/body/p
    

    我只想要

    page title /html/body/h1
    some text /html/body/p
    

    感谢您的帮助。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Manjit Ullal    8 年前

    我遇到了类似的困难,然后我发现每个etree节点都有一个迭代器,如果它的父节点可以使用它进行遍历的话

    例如,这里的root将为您提供body,您可以使用它迭代body的每个元素

    from lxml import etree
    parser = etree.HTMLParser()
    tree   = etree.parse('yourdocument.html', parser)
    
    root = tree.xpath('/html/body/')[0]
    for i in root.getiterator():
        print(i.tag,i.text)
    
        2
  •  0
  •   Alex Lee    8 年前

    您的html代码似乎有一个无效的格式,我刚刚用beautifuSoup编写了一个小程序,您可以使用该程序进行修改:

    from bs4 import BeautifulSoup
    html3 = "<html><head><title>test</title></head><body><h1>page title</h1><p>some text</p><body></html>"
    soup = BeautifulSoup(html3, "html5lib")
    body = soup.find('body')
    
    for item in body.findChildren():
        print(item)
    

    输出

    <h1>page title</h1>
    <p>some text</p>