SoupStrainer有两个论点吗?

2024-10-03 11:14:24 发布

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

一开始只是个问题,但到了一半我就想明白了。我在stackoverflow或Google上找不到这样的问题,所以我会把它贴出来,以帮助任何偶然发现它的人。在

我想使用beauthulsoup的SoupStrainer来解析两个标签,而不是html文档中的一个。在

我知道我能做到:

soup = BeautifulSoup(content.text, 'lxml', parse_only=SoupStrainer('p'))  

这将得到<p>标记。我还想得到<h3>标记。所以我试了一下:

^{pr2}$

但这行不通,因为SoupStrainer只接受一个论点。在

答案如下。在


Tags: text文档标记parsehtmlgoogle标签content
3条回答

下面是在bs4中如何定义SoupStrainer的构造函数:

class SoupStrainer(object):
    """Encapsulates a number of ways of matching a markup element (tag or
    text)."""

    def __init__(self, name=None, attrs={}, text=None, **kwargs):

...

因此,添加到@JohnStrood的答案中,您可以使用attrs参数(字典)通过一个或多个属性限制匹配:

^{pr2}$

regex中有更多的能量。使用re模块。在

This would get the <p> tags. I also wanted to get the <h3> tags.

soup = BeautifulSoup(content.text, 'lxml', parse_only=SoupStrainer(re.compile(r"p|h3")))

@玛蒂恩 对于属性,可以使用attrs。在

^{pr2}$

但显然不能为每个HTML应用class。您可以使用css选择器来解决它。在

soup = BeautifulSoup(content.text, 'lxml', parse_only=SoupStrainer(["h1", "h2", "h3", "p"])).select("h1.foo, h2, h3, p")

要使SoupStrainer解析多个标记,您需要将它们放在列表中。像这样:

soup = BeautifulSoup(content.text, 'lxml', parse_only=SoupStrainer(['h3', 'p']))

这将解析content.text中的<h3>和{}标记,即使它们是同级标记(即一个标记不在另一个标记内)。在

你也可以用两个以上的标签来实现,只要你把它们作为一个列表传递给SoupStrainer。在

一个标签:

^{pr2}$

多个标记:

soup = BeautifulSoup(content.text, 'lxml', parse_only=SoupStrainer(['h1', 'h3', 'p', 'h4']))

相关问题 更多 >