You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python和Beautiful Soup实现字符串部分匹配以抓取链接?

解决Beautiful Soup部分匹配链接文本的问题

嘿,我懂你现在的困扰——你之前用string=['something']是在做精确匹配,只有当<a>标签里的文本完完全全等于something时才会被命中,这就是为啥那些文本里只包含something的链接抓不到。

下面给你几个靠谱的方法来实现部分匹配:

方法1:用Lambda表达式做包含判断

这是最直接的方式,用lambda函数检查<a>标签的文本里是否包含目标字符串,还能顺便处理空文本和多余空格的问题:

import requests
from bs4 import BeautifulSoup

source = requests.get('http://www.website').text
page = BeautifulSoup(source, 'lxml')
for article in page.find_all('article'):
    # 匹配文本中包含"something"的a标签,同时过滤空文本和前后空格
    for a in article.find_all('a', string=lambda text: text and 'something' in text.strip()):
        link = a['href']
        print(link)

这里的text and是为了避免遇到没有文本的<a>标签时抛出错误,strip()则是去掉文本前后的空格,防止因为空格导致匹配失败。

方法2:用正则表达式实现灵活匹配

如果需要更复杂的匹配规则(比如忽略大小写、匹配模糊模式),正则表达式会是更好的选择:

import requests
import re
from bs4 import BeautifulSoup

source = requests.get('http://www.website').text
page = BeautifulSoup(source, 'lxml')
for article in page.find_all('article'):
    # 匹配包含"something"的文本,忽略大小写
    for a in article.find_all('a', string=re.compile(r'something', re.IGNORECASE)):
        link = a['href']
        print(link)

你可以根据需求修改正则规则,比如re.compile(r'some.*thing')就能匹配something、some_random_thing这类变体。

方法3:遍历后手动判断文本

要是上面的方法都不符合你的场景,也可以先把所有<a>标签抓出来,再手动筛选:

import requests
from bs4 import BeautifulSoup

source = requests.get('http://www.website').text
page = BeautifulSoup(source, 'lxml')
for article in page.find_all('article'):
    for a in article.find_all('a'):
        # 先确认标签有文本,再判断是否包含目标字符串
        if a.text and 'something' in a.text.strip():
            link = a['href']
            print(link)

额外小提醒

  • 有些网站的<a>标签文本可能嵌套在<span>或其他子标签里,这时候a.text会自动把所有子标签的文本合并成一个字符串,刚好适合我们的包含判断。
  • 如果遇到动态加载的内容,requests可能抓不到完整页面,这时候就得考虑用Selenium这类工具了,但那是另一个话题啦。

内容的提问来源于stack exchange,提问作者Alan Ma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:48:51