BeautifulSoup findAll()给出了多个类?

seb*_*ebo 40 html python beautifulsoup html-parsing

我想从网站上删除一个项目列表,并保留它们的显示顺序.这些项目按表格组织,但它们可以是两个不同类别之一(按随机顺序).

有没有办法提供多个类,并让BeautifulSoup4找到任何给定类中的所有项目?

我需要实现此代码的功能,除了保留源代码中的项目顺序:

items = soup.findAll(True,{'class':'class1'})
items += soup.findAll(True,{'class':'class2'})
Run Code Online (Sandbox Code Playgroud)

Rom*_*kar 65

你可以这样做

soup.findAll(True, {'class':['class1', 'class2']})
Run Code Online (Sandbox Code Playgroud)

例:

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<html><body><div class="class1"></div><div class="class2"></div><div class="class3"></div></body></html>')
>>> soup.findAll(True, {"class":["class1", "class2"]})
[<div class="class1"></div>, <div class="class2"></div>]
Run Code Online (Sandbox Code Playgroud)

  • @sebo试试这个:`soup.findAll(True,{"class":["equal","up"]})`. (2认同)

Bho*_*opi 14

我是使用BeautifulSoup的Python的新手,但可能是我的答案帮助你.我遇到了同样的情况,我必须找到一个标签的多个类,所以,我只是将类传递给一个数组,它适用于我.这是代码片段

//Search with single Class
    find_all("tr",  {"class":"abc"})
//Search with multiple classes
    find_all("tr",  {"class": ["abc", "xyz"]})
Run Code Online (Sandbox Code Playgroud)

  • 我如何使它成为“和”? (17认同)
  • `{"class":["abc","xyz"]}`对应于`或`选择器或`和`选择器? (5认同)
  • 您可以使用“select”而不是“find_all”。@SundeepPidugu `选择('div.abc.xyz')` (4认同)
  • 它对应于`或` (3认同)

Abd*_*kka 12

或者使用最新版本的 BeautifulSoup:

find_all('a', class_=['class1', 'class2'])
Run Code Online (Sandbox Code Playgroud)

使用“class”会返回一个错误,所以他们使用“class_”代替。


ale*_*cxe 9

一种方法是使用正则表达式而不是类名:

import re
import requests
from bs4 import BeautifulSoup


s = requests.Session()
link = 'https://leaderboards.guildwars2.com/en/na/achievements'
r = s.get(link)


soup = BeautifulSoup(r.text)
for item in soup.findAll(True, {"class": re.compile("^(equal|up)$")}):
    if 'achievements' in item.attrs['class'] and 'number' in item.attrs['class']:
        print item
Run Code Online (Sandbox Code Playgroud)


dan*_*ilo 8

    <html>
        <body>
            <div class="cls1">ok</div>
            <div class="cls2">hi</div>
            <div class="cls1 cls2">both</div>
        </body>
    </html>
Run Code Online (Sandbox Code Playgroud)

假设 html 变量包含上面的 html 代码

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html)
    divs = soup.find_all('div', class_=['cls1', 'cls2'])
    print(divs)
Run Code Online (Sandbox Code Playgroud)

这将输出:

[<div class="cls1">ok</div>, <div class="cls2">hi</div>, <div class="cls1 cls2">both</div>]
Run Code Online (Sandbox Code Playgroud)

它是“OR”运算符而不是“AND”,也就是说,元素不需要同时具有这两个类。
要使用“AND”运算符,您可以使用select('div.cls1.cls2')

[<div class="cls1">ok</div>, <div class="cls2">hi</div>, <div class="cls1 cls2">both</div>]
Run Code Online (Sandbox Code Playgroud)

这将输出:

[<div class="cls1 cls2">both</div>]
Run Code Online (Sandbox Code Playgroud)