使用 BeautifulSoup 遍历 html 树中的元素,并生成保持每个元素相对位置的输出?在 Python 中

Posted

技术标签:

【中文标题】使用 BeautifulSoup 遍历 html 树中的元素,并生成保持每个元素相对位置的输出?在 Python 中【英文标题】:Iterate through elements in html tree using BeautifulSoup, and produce an output that maintains the relative position of each element? in Python 【发布时间】:2012-11-24 01:33:53 【问题描述】:

我有这段代码可以在 Java 中使用 Jsoup 完成我需要它做的事情

Elements htmlTree = doc.body().select("*");

    Elements menuElements = new Elements();

    for(Element element : htmlTree) 

        if(element.hasClass("header")) 
            menuElements.add(element);
        if(element.hasClass("name"))
            menuElements.add(element);
        if(element.hasClass("quantity"))
            menuElements.add(element);
    

我想做同样的事情,但在 Python 中使用 BeautifulSoup。我试图抓取的 HTML 示例树如下:

<div class="header"> content </div>
     <div class="name"> content </div>
     <div class="quantity"> content </div>
     <div class="name"> content </div>
     <div class="quantity"> content </div>
<div class="header"> content2 </div>
     <div class="name"> content2 </div>
     <div class="quantity"> content2 </div>
     <div class="name"> content2 </div>
     <div class="quantity"> content2 </div>

等等

基本上我希望输出保留每个元素的相对位置。我将如何使用 Python 和 BeautifulSoup 做到这一点?

编辑:

这是我拥有的 python 代码(它非常幼稚)但也许它可以提供帮助?

output = []

for e in soup :
  if e["class"] == "pickmenucolmenucat" :
    output.append(e)
  if e["class"] == "pickmenucoldispname" :
    output.append(e)
  if e["class"] == "pickmenucolportions" :
    output.append(e)

【问题讨论】:

是什么让您认为 BeautifulSoup 不能保持秩序?显示您拥有的代码。 我真的什么都没有。我遇到的问题是我的内容中有一些空且无用的标签。我对 jSoup 所做的基本上是检查每个标签是否有我需要的类,然后将元素添加到列表中,如果它匹配。我想知道如何做到这一点,或者是否有更简单的方法来做到这一点 我用我的python代码添加了一个编辑(非常天真)它也给了我一个类型错误(字符串索引必须是整数) 【参考方案1】:

从给定列表中查找所有具有class 属性的&lt;div&gt; 元素:

#!/usr/bin/env python
from bs4 import BeautifulSoup # $ pip install beautifulsoup4

with open('input.xml', 'rb') as file:
    soup = BeautifulSoup(file)

elements = soup.find_all("div", class_="header name quantity".split())
print("\n".join(" ".format(el['class'], el.get_text()) for el in elements))

输出

['header']  content 
['name']  content 
['quantity']  content 
['name']  content 
['quantity']  content 
['header']  content2 
['name']  content2 
['quantity']  content2 
['name']  content2 
['quantity']  content2 

还有other methods that allows you to search, traverse html elements。

【讨论】:

以上是关于使用 BeautifulSoup 遍历 html 树中的元素,并生成保持每个元素相对位置的输出?在 Python 中的主要内容,如果未能解决你的问题,请参考以下文章

使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解(新手必学)

Python BeautifulSoup,遍历标签和属性

第65天:爬虫利器 Beautiful Soup 之遍历文档

第65天:爬虫利器 Beautiful Soup 之遍历文档

BeautifulSoup文档3-详细方法 | 如何对文档树进行遍历?

Python爬虫利器:BeautifulSoup库