擅长:python、mysql、java
<p><strong>TLDR;</strong>不,这目前在beauthoulsoup中不容易实现(需要修改beauthulsoup和SoupStrainer对象)。在</p>
<p><strong>说明:</strong></p>
<p>问题是在<code>handle_starttag()</code>方法上调用了过滤器传递函数。正如您所猜到的,您只有开始标记中的值(例如元素名和属性)。在</p>
<p><a href="https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/bs4/__init__.py#L524" rel="nofollow noreferrer">https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/bs4/<strong>init</strong>.py#L524</a></p>
<pre><code>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
</code></pre>
<p>如您所见,如果您的过滤器函数返回False,元素将立即被丢弃,而没有机会考虑内部文本(不幸的是)。在</p>
<p>另一方面,如果你添加“文本”来搜索。在</p>
^{pr2}$
<p>它将开始在标记内搜索文本,但它没有元素或属性的上下文-您可以看到讽刺的是:/</p>
<p>把它们组合起来就什么也找不到。而且您甚至不能访问find函数中显示的父级:
<a href="https://gist.github.com/RichardBronosky/4060082" rel="nofollow noreferrer">https://gist.github.com/RichardBronosky/4060082</a></p>
<p>所以目前过滤器只是很好的过滤元素/属性。你需要修改很多漂亮的soup代码才能工作。在</p>
<p>如果您真的需要这样做,我建议继承beauthulsoup和SoupStrainer对象并修改它们的行为。在</p>