【问题标题】:How to do a general search如何进行一般搜索
【发布时间】:2026-01-11 11:55:01
【问题描述】:

我正在尝试使用 PyQt5 制作一个简单的浏览器(通过遵循教程)。除了一个小问题外,它大部分都在工作 -

def navigate_to_url(self): 
    q = QUrl(self.urlbar.text())
    print(type(q)) 
    if q.scheme() == "":
        q.setScheme("http")
    self.tabs.currentWidget().setUrl(q)

每当我在地址栏中输入内容时,它都会搜索它,但会添加一个“http://”。但是,如果我想搜索“猫”之类的内容,我希望它像普通浏览器一样工作,即为我提供与猫相关的链接。

普通图片:

但是,由于添加了“https://”,它给了我一个 NAME_NOT_RESERVED 错误。

错误图片:

有没有办法解决这个问题?

【问题讨论】:

    标签: python python-3.x pyqt5


    【解决方案1】:

    你可以尝试做一些检查它是否只是一个普通的单词,如果是,那么不要做http://,例如我有一个包含很多英文单词的txt文档,你可以用它来检查它是否一个普通的词,像这样:

    if (re.findall(r'\b'+ re.escape(word1) + r'\b', contents, re.MULTILINE))
    

    将 word1 分配给您的单词并将内容分配给字典

    这是另一个例子:

    import re
    with open('dictionary.txt') as fh:
        contents = fh.read()
    

    【讨论】:

    • 检查它是否是一个链接不是更容易吗?就像搜索以“org”、“com”等结尾...
    • 也许吧,但我会这样做
    • 谢谢。我试试看。
    • 欢迎来到 *!如果有帮助,请阅读:What should I do when someone answers my question?,以及关于acceptingvoting。 - @Hunter
    • 还有一件事,你能给我解释一下setScheme方法吗?
    【解决方案2】:

    如果查询匹配或不匹配某些条件,请考虑将 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

    或者,您可以在搜索前添加一些字符(可能是空格 或关键字,如 ds 搜索前)

    您可能还需要对您的字符串进行 URL 编码(将 替换为+,将? 替换为%3F 等),这也可以通过urllib.parseurllib.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/ 这样的第三方库可能更适合您

    【讨论】: