【问题标题】:Python BeautifulSoup find_all with regex doesn't match text带有正则表达式的 Python BeautifulSoup find_all 与文本不匹配
【发布时间】:2020-08-14 22:16:47
【问题描述】:

我有以下 HTML 代码:

<a class="nav-link" href="https://cbd420.ch/fr/tous-les-produits/">
<span class="cbp-tab-title">
                                Shop <i class="fa fa-angle-down cbp-submenu-aindicator"></i></span>
</a>

我想获取具有Shop 的锚标记作为文本,而不考虑前后的间距。我已经尝试了以下代码,但我一直得到一个空数组:

import re
html  = """<a class="nav-link" href="https://cbd420.ch/fr/tous-les-produits/">
<span class="cbp-tab-title">
                                Shop <i class="fa fa-angle-down cbp-submenu-aindicator"></i></span>
</a>"""
soup = BeautifulSoup(html, 'html.parser')
prog = re.compile('\s*Shop\s*')
print(soup.find_all("a", string=prog))
# Output: []

我还尝试使用 get_text() 检索文本:

text = soup.find_all("a")[0].get_text()
print(repr(text))
# Output: '\n\n\t\t\t\t\t\t\t\tShop \n'

并运行以下代码以确保我的正则表达式是正确的,这似乎是这种情况。

result = prog.match(text)
print(repr(result.group()))
# Output: '\n\n\t\t\t\t\t\t\t\tShop \n'

我也尝试选择span 而不是a,但我遇到了同样的问题。我猜这是find_all 的问题,我已经阅读了BeautifulSoup documentation,但我仍然找不到问题。任何帮助,将不胜感激。谢谢!

【问题讨论】:

  • 试试soup.find(lambda t: t.name == "a" and 'Shop' in t.text)
  • 哇!谢谢。知道为什么它不适用于正则表达式吗? @WiktorStribiżew

标签: python html regex beautifulsoup re


【解决方案1】:

您在这里遇到的问题是您要查找的文本位于包含子标签的标签中,并且当标签具有子标签时,string 属性为空。

您可以在 .find 调用中使用 lambda 表达式,并且由于您正在寻找固定字符串,因此您可以仅使用 'Shop' in t.text 条件而不是正则表达式检查:

soup.find(lambda t: t.name == "a" and 'Shop' in t.text)

【讨论】:

    【解决方案2】:

    您正在搜索的文本 Shopspan 标记内,因此当您尝试使用正则表达式时,它无法使用正则表达式获取值。

    您可以尝试正则表达式来查找文本,然后查找其父项。

    import re
    html  = """<a class="nav-link" href="https://cbd420.ch/fr/tous-les-produits/">
    <span class="cbp-tab-title">
                                    Shop <i class="fa fa-angle-down cbp-submenu-aindicator"></i></span>
    </a>"""
    soup = BeautifulSoup(html, 'html.parser')
    print(soup.find(text=re.compile('Shop')).parent.parent)
    

    如果您有 BS 4.7.1 或更高版本,则可以使用以下 css 选择器。

    html  = """<a class="nav-link" href="https://cbd420.ch/fr/tous-les-produits/">
    <span class="cbp-tab-title">
                                    Shop <i class="fa fa-angle-down cbp-submenu-aindicator"></i></span>
    </a>"""
    soup = BeautifulSoup(html, 'html.parser')
    print(soup.select_one('a:contains("Shop")'))
    

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 2017-06-30
      • 2016-01-16
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多