使用Python中的beauthulsoup根据不同的条件查找不同的元素

2024-10-01 22:41:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用Beautiful SoupPython库的findAll()函数,在一个HTML中找到几个元素。这些元素必须满足几个标准,但必须是独立的。在

例如,假设我的对象如下所示:

<div class="my_class">
    <span class="not_cool">
        <p name="p_1">A</p>
        <p name="p_2">B</p>
    </span>
    <span class="cool">
        <p name="p_3">C</p>
    </span>
</div>

我想找到class="cool"中的每一个span,以及每一个带有{}的p(这里每一个都只有一个,但假设情况并非如此)。在

个人而言,我将:

^{pr2}$

在一个完美的世界里,我想做的是:

.findAll([
        ["span",attrs={"class":"cool"}],
        ["p",attrs={"name":"p_1"}]
    ]}

但当然,它不是这样工作的。在

实际上,我试着做一个将HTML转换成BBCode的函数(我不想要也不能使用现有的)。 所以,我只需要保留一些我感兴趣的标签。在

不过,我还必须知道这些元素的顺序。如果我使用两个不同的.findAll(),我将不知道什么是在什么之前,什么是在什么之后。在

有人有解决办法吗?在


Tags: 对象函数namediv元素标准myhtml
2条回答

你必须使用搜索功能:

.find_all(lambda t: (t.name == 'span' and 'cool' in t['class']) or
                    (t.name == 'p' and t.get('name') == 'p_1'))

树中的每个标记对象都将传递一个可调用参数;如果可调用参数返回True,则包含该参数。上面的lambda测试标记名是否匹配以及是否存在特定属性。class属性的特殊之处在于当它存在时,它总是被解析为一个列表。在

请注意,对于beautifulsoup4,camel case函数名已被弃用;带有下划线名称的小写函数名是规范方法。如果您仍在使用BeautifulGroup 3,您可能需要升级。版本3已经两年多没有更新了。在

只需通过迭代所有所需的spans,找到每个span的所有子类。在

spans = soup.findAll("span",attrs={"class":"cool"})
for span in spans:
    ps = span.findAll("p",attrs={"name":"p_1"})

相关问题 更多 >

    热门问题