如何用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
相关产品推荐
相关产品推荐

