Python/Scrapy新手求助:如何基于域名匹配从两列表创建多值字典
解决URL域名分组的Python实现方案
嘿,作为刚接触Python和Scrapy的新手,这种按域名分组的需求确实容易让人懵,我来给你一步步拆解怎么实现~
核心思路
我们要把列表b里的每个URL,匹配到列表a中对应的根域名下,最终生成一个键为根域名、值为对应URL列表的字典。
实现步骤
1. 初始化字典
首先我们需要创建一个初始字典,把a里的每个域名都设为键,对应的值先设为空列表,这样后续可以直接往里面加匹配到的URL。
2. 匹配并分组URL
有两种常见的实现方式,分别适合不同场景:
方式一:简单字符串匹配(适合当前场景)
因为你的b列表里的URL都是以a里的域名开头的,直接用字符串的startswith()方法就能快速判断匹配关系:
a = ['www.google.com', 'www.facebook.com', 'www.twitter.com'] b = ['www.google.com/adsense/', 'www.twitter.com/login', 'www.facebook.com/user/xx', 'www.facebook.com/user/yy', 'www.google.com/adwords'] # 初始化字典,每个域名对应空列表 c = {domain: [] for domain in a} # 遍历b中的每个URL,匹配对应域名 for url in b: for domain in a: if url.startswith(domain): c[domain].append(url) break # 找到匹配的域名就跳出循环,避免重复匹配 print(c)
运行后得到的结果就是你想要的:
{ 'www.google.com': ['www.google.com/adsense/', 'www.google.com/adwords'], 'www.facebook.com': ['www.facebook.com/user/xx', 'www.facebook.com/user/yy'], 'www.twitter.com': ['www.twitter.com/login'] }
方式二:URL解析匹配(更严谨,适合复杂场景)
如果后续遇到带http:///https://的URL,或者需要更精准的域名解析,推荐用Python内置的urllib.parse.urlparse模块来提取域名部分:
from urllib.parse import urlparse a = ['www.google.com', 'www.facebook.com', 'www.twitter.com'] b = ['https://www.google.com/adsense/', 'http://www.twitter.com/login', 'www.facebook.com/user/xx'] # 初始化字典 c = {domain: [] for domain in a} # 把a里的域名转成解析后的标准域名格式,方便匹配 parsed_domain_map = {urlparse(f'http://{domain}').netloc: domain for domain in a} for url in b: # 解析当前URL的域名部分 parsed_url = urlparse(url) # 如果解析后的域名在我们的映射里,就添加到对应列表 if parsed_url.netloc in parsed_domain_map: original_domain = parsed_domain_map[parsed_url.netloc] c[original_domain].append(url) print(c)
这种方式能处理各种URL格式的情况,避免因为前缀差异导致匹配失败。
小提示
- 代码里的
break很重要,能确保一个URL只会被匹配到对应的域名下,不会重复添加。 - 如果
b里有找不到匹配域名的URL,代码会自动忽略它,不会影响字典里的其他内容。
内容的提问来源于stack exchange,提问作者ElmiiS
相关产品推荐
相关产品推荐

