如果查询匹配或不匹配某些条件,请考虑将 url 显式设置为搜索引擎搜索
在最基本的情况下,您可以为此使用urllib.parse.urlparse,尽管它可能并不完全适合所有地址,因为它需要一个方案前缀,大多数人不会理会它并让http(s)被浏览器隐式添加
>>> import urllib.parse
>>> urllib.parse.urlparse("https://example.com") # full example
ParseResult(scheme='https', netloc='example.com', path='', params='', query='', fragment='')
>>> urllib.parse.urlparse("cats") # search works
ParseResult(scheme='', netloc='', path='cats', params='', query='', fragment='')
>>> urllib.parse.urlparse("example.com") # fails for missing scheme
ParseResult(scheme='', netloc='', path='example.com', params='', query='', fragment='')
如果解析后的path 包含.,则对没有scheme 的预期URL 进行快速测试以提示地址是netloc
或者,您可以在搜索前添加一些字符(可能是空格 或关键字,如 d 或 s 搜索前)
您可能还需要对您的字符串进行 URL 编码(将 替换为+,将? 替换为%3F 等),这也可以通过urllib.parse 的urllib.parse.quote_plus 来完成
>>> urllib.parse.quote_plus("What does a url-encoded cat query look like?")
'What+does+a+url-encoded+cat+query+look+like%3F'
Duck Duck Go Search Parameters
大家一起
import urllib.parse
url_search_template = "https://duckduckgo.com/?q={}"
keyword_search = "d "
text = self.urlbar.text()
def probably_a_search(s):
# check for prefix first to prevent matches against a search like 3.1415
if s.startswith(keyword_search):
return True, s[len(keyword_search):] # slice search prefix
parsed_url = urllib.parse.urlparse(s)
if parsed_url.scheme or parsed_url.netloc:
return False, s
if "." in parsed_url.path:
return False, s
return True, s
is_search, text = probably_a_search(text)
if is_search:
text = url_search_template.format(urllib.parse.quote_plus(text.strip()))
q = QUrl(text)
为了对 TLD 进行更准确的测试(而不是简单地存在 .),像 https://pypi.org/project/tld/ 这样的第三方库可能更适合您