例如
bs = BeautifulSoup("<html><a>sometext</a></html>")
print bs.find_all("a",text=re.compile(r"some"))
返回
[<a>sometext</a>]
,但是当搜索的元素有一个 child 时,即img
bs = BeautifulSoup("<html><a>sometext<img /></a></html>")
print bs.find_all("a",text=re.compile(r"some"))
它返回
[]
有没有一种方法可以使用
find_all
来匹配后面的示例? 最佳答案
您将需要使用一种混合方法,因为当一个元素同时具有子元素和文本时,text=
将会失败。
bs = BeautifulSoup("<html><a>sometext</a></html>")
reg = re.compile(r'some')
elements = [e for e in bs.find_all('a') if reg.match(e.text)]
背景
当BeautifulSoup搜索元素时,并且
text
是可调用的,则最终是eventually calls:self._matches(found.string, self.text)
在您给出的两个示例中,
.string
方法返回不同的内容:>>> bs1 = BeautifulSoup("<html><a>sometext</a></html>")
>>> bs1.find('a').string
u'sometext'
>>> bs2 = BeautifulSoup("<html><a>sometext<img /></a></html>")
>>> bs2.find('a').string
>>> print bs2.find('a').string
None
.string
方法如下所示:@property
def string(self):
"""Convenience property to get the single string within this tag.
:Return: If this tag has a single string child, return value
is that string. If this tag has no children, or more than one
child, return value is None. If this tag has one child tag,
return value is the 'string' attribute of the child tag,
recursively.
"""
if len(self.contents) != 1:
return None
child = self.contents[0]
if isinstance(child, NavigableString):
return child
return child.string
如果我们打印出内容,我们可以看到为什么返回
None
:>>> print bs1.find('a').contents
[u'sometext']
>>> print bs2.find('a').contents
[u'sometext', <img/>]
关于python - Beautifulsoup使用 `find_all`通过文本查找元素,无论其中是否有元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16090324/