如何使用Regex从HTML文档中提取域名?
嘿,我来帮你搞定用正则从HTML文档里提取域名的事儿!不过先给你打个预防针:用正则解析HTML其实不是最优解——毕竟HTML的结构太灵活了,标签嵌套、属性换行、特殊字符啥的分分钟让正则失效。但如果是简单场景,或者你确实得用正则,下面的方法可以试试~
方法1:匹配HTML中所有带协议的URL并提取域名
HTML里的域名大多藏在<a href>、<img src>这类属性里,或者直接是文本中的完整URL。先写一个基础正则,先匹配完整URL,再提取核心域名部分。
正则表达式示例
https?://(?:www\.)?([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+)
正则解释:
https?://:匹配http://或https://协议头(?:www\.)?:?:表示非捕获组,这里匹配可选的www.前缀,不会把它算进我们要的域名里([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+):这是核心的捕获组,匹配多级域名(比如example.com、sub.example.co.uk)
代码示例(Python)
import re # 示例HTML内容 html = ''' <a href="https://www.example.com/home">首页</a> <img src="http://blog.example.co.uk/cover.jpg"> <p>访问我们:https://another-site.org</p> ''' # 编译正则 pattern = re.compile(r'https?://(?:www\.)?([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+)') # 找到所有匹配项 matches = pattern.findall(html) # 去重后输出域名 unique_domains = list(set(matches)) print(unique_domains) # 输出: ['example.com', 'another-site.org', 'blog.example.co.uk']
方法2:精准匹配HTML标签属性中的域名
如果你只想提取<a>的href或<img>的src里的域名,可以写更针对性的正则:
<(?:a|img)[^>]+(?:href|src)=["']https?://(?:www\.)?([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+)["']
这个正则会只匹配<a>和<img>标签里的绝对URL,避免提取文本中无关的URL。
务必注意:正则的局限性
再强调一次,正则真的不适合复杂HTML场景:
- 如果标签属性用单引号、或者属性值里有转义字符,正则可能匹配失败
- 相对路径(比如
/about)没有域名,正则会直接忽略 - 嵌套标签、注释里的URL可能被误匹配
更靠谱的替代方案
如果要处理复杂HTML,强烈建议用HTML解析库+URL解析工具,比如Python的BeautifulSoup和urllib.parse:
from bs4 import BeautifulSoup from urllib.parse import urlparse soup = BeautifulSoup(html, 'html.parser') domains = set() # 提取所有a标签的href域名 for link in soup.find_all('a', href=True): parsed_url = urlparse(link['href']) if parsed_url.netloc: # 确保是绝对URL # 可选去掉www前缀 clean_domain = parsed_url.netloc.replace('www.', '') domains.add(clean_domain) # 提取所有img标签的src域名 for img in soup.find_all('img', src=True): parsed_url = urlparse(img['src']) if parsed_url.netloc: clean_domain = parsed_url.netloc.replace('www.', '') domains.add(clean_domain) print(list(domains))
这个方法能处理各种奇葩HTML结构,比正则靠谱100倍!
内容的提问来源于stack exchange,提问作者Reinstecker
相关产品推荐
相关产品推荐

