如何在lxml中结合Pandas与正则表达式筛选特定格式URL
用正则过滤符合特定结尾规则的URL
嘿,我来帮你搞定这个URL过滤的问题!既然你已经有了在regex101验证过的正则,那核心就是把它和你的爬取逻辑结合起来,筛选出符合要求的URL就行。我用Python举例子(毕竟爬虫场景里最常用这个),你可以对应到自己用的编程语言调整:
1. 过滤已爬好的URL列表
如果你已经把所有爬取到的URL存在了all_urls列表里,直接用列表推导式加正则模块就能快速筛选:
import re # 把这里换成你验证过的正则,记得一定要加结尾锚定$,确保是URL末尾匹配 # 比如对应/[若干字母][3个数字]结尾的示例正则是:r'\/[a-zA-Z]+\d{3}$' pattern = re.compile(r'\/[a-zA-Z]+\d{3}$') # 过滤出符合规则的URL filtered_urls = [url for url in all_urls if pattern.search(url)]
为啥要加$?要是不加的话,可能会误判那些中间包含/字母+3数字的URL(比如/abc123/def这种明显不符合你的需求,但没加$就会被匹配到),加了$就只会匹配正好以该模式结尾的URL,和你要的完全一致。
2. 爬取时直接过滤(更省内存)
要是不想先爬一堆URL再过滤,还能在爬取到单个URL的时候就判断,符合条件再存起来,这样能少占内存:
import re import requests from bs4 import BeautifulSoup pattern = re.compile(r'\/[a-zA-Z]+\d{3}$') target_urls = [] # 举个用BeautifulSoup爬取的例子,你换成自己的爬取逻辑就行 response = requests.get("你的目标网站地址") soup = BeautifulSoup(response.text, 'html.parser') for link in soup.find_all('a', href=True): url = link['href'] # 先检查是否符合正则,符合才加入结果列表 if pattern.search(url): target_urls.append(url)
小提醒
- 不管是相对URL(比如
/abc123)还是绝对URL(比如https://xxx.com/abc123),这个正则都能正常匹配到结尾的部分,不用额外调整。 - 写正则的时候记得用原始字符串(前面加
r),避免转义字符搞出问题。
这样修改后,你得到的就是完全符合要求的URL列表啦!
内容的提问来源于stack exchange,提问作者SeagullWardy




