TLDR;不,目前这在 BeautifulSoup 中不太可能实现(需要修改 BeautifulSoup 和 SoupStrainer 对象)。
解释:
问题是调用了 Strainer 传递的函数handle_starttag()
方法。正如您所猜测的,您只有开始标记中的值(例如元素名称和属性)。
https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/bs4/init.py#L524 https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/bs4/__init__.py#L524
if (self.parse_only and len(self.tagStack) <= 1
and (self.parse_only.text
or not self.parse_only.search_tag(name, attrs))):
return None
正如您所看到的,如果您的 Strainer 函数返回 False,该元素将立即被丢弃,而没有机会考虑内部文本(不幸的是)。
另一方面,如果您添加“文本”进行搜索。
SoupStrainer(text="my text")
它将开始在标签内搜索文本,但这没有元素或属性的上下文 - 你可以看到讽刺:/
将它们组合在一起将一无所获。而且您甚至无法像 find 函数中所示那样访问父级:https://gist.github.com/RichardBrnosky/4060082 https://gist.github.com/RichardBronosky/4060082
所以目前过滤器可以很好地过滤元素/属性。您需要更改大量 Beautiful soup 代码才能使其正常工作。
如果你确实需要这个,我建议继承 BeautifulSoup 和 SoupStrainer 对象并修改它们的行为。