我对美丽的汤有问题。特别是使用.find方法。有没有一种方法可以让我广泛匹配而不是完全匹配?现在,仅在找到“第一后”的情况下它才起作用。
soup.find("a", string="First Last").get('href')
Id希望它找到带有或不带有大写字母的这两个单词的组合中的任何一个。这样就会找到
First
first
Last first
last last
something something last
etc..
感谢您的帮助!
答案 0 :(得分:1)
Kinds of filter的文档深入解释了所有许多选项。 (请确保至少在此之后的find_all()
,name
和关键字参数部分中继续进行;这是您找到最佳示例的地方。)
您使用的那个仅完全匹配:
最简单的过滤器是字符串。将字符串传递给搜索方法,Beautiful Soup将对该字符串进行匹配。
但是您可以改为使用a regex:
如果传入正则表达式对象,Beautiful Soup将使用其search()方法针对该正则表达式进行过滤。
soup.find("a", string=re.compile(r'(?i)(first|last)'))
…或a function:
如果没有其他匹配项对您有用,则定义一个将元素作为唯一参数的函数。如果参数匹配,该函数应返回True,否则返回False。
def matches_firstlast(s):
lower = s.casefold()
return 'first' in lower or 'last' in lower
soup.find("a", string=matches_firstlast)
您还可以编写一个带有整个标签的函数,而不是仅包含其string
的函数,如果出现问题,该函数可以更灵活地应对意外标签引起的错误。
您尚未非常清楚地指定所需的确切规则,也没有给我们提供完整的示例进行测试,因此我不能保证正则表达式或函数实际上可以完全满足您的要求。这是一个示例:
>>> h = '<a>first</a> <a>last first</a> <a>something something last</a> <a>larst fist</a> <p>First Last</p>'
>>> soup = BeautifulSoup(h, 'lxml')
>>> soup.find_all("a", string=re.compile(r'(?i)(first|last)'))
[<a>first</a>, <a>last first</a>, <a>something something last</a>]
>>> soup.find_all("a", string=matches_firstlast)
[<a>first</a>, <a>last first</a>, <a>something something last</a>]
希望这和文档足够编写所需的代码。