【问题标题】:Beautifulsoup multiple class selectorBeautifulsoup 多类选择器
【发布时间】:2017-03-11 09:09:26
【问题描述】:

我想选择所有具有 A 和 B 作为类属性的 div。

以下选择

soup.findAll('div', class_=['A', 'B'])

但是选择所有在其类属性中具有 A 或 B 的 div。类可能有许多其他属性(C、D 等),顺序不限,但我只想选择同时具有 A 和 B 的那些。

【问题讨论】:

  • soup.findAll('div', class_= 'A B'),下单怎么样?
  • @PadraicCunningham 如果类 only 有 A 和 B,这将起作用。例如,<div class="A B C" /> 不会被捕获。我不确定这是否是OP想要的。听起来他想抓住他们,即使他们还有很多其他职业。
  • @sytech 正是如此。

标签: python beautifulsoup


【解决方案1】:
table = soup.find_all("tr",class_=["odd","even"])

试试这个方法!确保您使用了这些引号和大括号的正确结构。这让我很困惑。

【讨论】:

    【解决方案2】:

    最新的BeautifulSoup,可以使用regex搜索class

    代码:

    import re
    from bs4 import BeautifulSoup
    
    multipleClassHtml = """
    <div class="A B">only A and B</div>
    <div class="A     B">class contain space</div>
    <div class="A B C D">except A and B contain other class</div>
    <div class="A C D">only A</div>
    <div class="B D">only B</div>
    <div class=" D E F">no A B</div>
    """
    
    soup = BeautifulSoup(multipleClassHtml, 'html.parser')
    
    bothABClassP = re.compile("A\s+B", re.I)
    foundAllAB = soup.find_all("div", attrs={"class": bothABClassP})
    print("foundAllAB=%s" % foundAllAB)
    

    输出:

    foundAllAB=[<div class="A B">only A and B</div>, <div class="A    B">class contain space</div>, <div class="A B C D">except A and B contain other class</div>]
    

    【讨论】:

      【解决方案3】:

      您可以改用 CSS 选择器,这可能是这里最好的解决方案。

      soup.select("div.classname1.classname2")
      

      你也可以use a function。

      def interesting_tags(tag):
          if tag.name == "div":
              classes = tag.get("class", [])
              return "A" in classes and "B" in classes
      
      soup.find_all(interesting_tags)
      

      【讨论】:

      • 很好的解决方案,它适用于我的目的。在interesting_tags() 中没有tag 输入的情况下,最后一行如何执行?
      • @InfiniteFlashChess find_all 方法(以及find)接受一个可调用对象。在 find_all 方法中,BeautifulSoup 将调用提供的可调用对象,并将其传递给每个标签的标签参数。如果您的可调用对象返回True,则该标签将包含在结果集中。 relevant docs
      【解决方案4】:

      1 一些标签,如:

      <span class="A B C D">XXXX</span>
      

      如果你想使用 CSS 选择器来获取标签,你可以编写 class 属性的代码如下:

      spans = beautifulsoup.select('span.A.B.C.D')
      

      2如果你想用这个作为id属性,你改变如下:

      <span id="A">XXXX</span>
      

      更改您在选择功能中使用的符号:

      span = beautifulsoup.select('span#A')
      

      我们了解到,它的语法类似于 CSS3

      【讨论】:

        【解决方案5】:

        改用css selectors:

        soup.select('div.A.B')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-20
          • 1970-01-01
          • 2021-08-02
          • 1970-01-01
          • 2016-02-25
          • 2018-08-19
          • 1970-01-01
          • 2016-03-27
          相关资源
          最近更新 更多