在方法调用中使用正则表达式或模式匹配?

时间:2017-11-21 15:31:31

标签: python python-3.x

所以我正在使用机械汤包的测试来进入一些webscraping的东西,我遇到了一个有趣的问题。我想获得一个页面中所有链接的列表,这些链接在显示的文本中有一个句点,表示一个文件。我可以在for循环中使用if语句检查它:

for link in browser.links():
     if '.' in str(link.string):

但是links方法有一种方法可以使用link_text ="无论"来搜索链接的字符串,但它需要完全匹配。

我有什么方法可以做:

for link in browser.links(link_text=something_with_a_period_in_it):

我有一种感觉,这不会节省任何计算时间,但我可以看到它在将来有用。

1 个答案:

答案 0 :(得分:0)

如果您覆盖相等比较,则可以执行此操作。

links()方法的code表明这就是使用link_text完成的所有工作:

if link_text is not None:
    all_links = [a for a in all_links 
                 if a.text == link_text]

所以这只是一个简单的平等比较。你想要的是一个对象,当且仅当该字符串包含.时才与字符串进行比较。这是一个简单的例子:

class ContainsDot(object):
    def __eq__(self, other):
        return '.' in other

您需要实例化它,然后您可以将它与任何字符串进行比较并获得您期望的结果:

>>> c = ContainsDot()
>>> 'sdfsdfasdf' == c
False
>>> 'sdfasdf.asdfasd' == c
True
>>> c == 'sdfasdfa.asdfasd'
True
>>> c == ''
False
>>> c == '.'
True

我没有MechanicalSoup但无法测试,但它应该如下:

for link in browser.links(link_text=ContainsDot()):