Qt或通用c++如何在c++中获取或检测<a href="file.html" >的宿主

Posted

技术标签:

【中文标题】Qt或通用c++如何在c++中获取或检测<a href="file.html" >的宿主【英文标题】:Qt or general c++ How to get or detect the host of the <a href="file.html" > in c++ 【发布时间】:2012-10-29 12:46:14 【问题描述】:

我有一个简单的应用程序,可以从网页获取所有链接,我使用 libexml2 来解析 html 并提取其中的 html 链接 和 Qt QNetworkAccessManager 用于 http 请求。 现在的问题是如何自动检测链接的主机名,例如:

<a href="thelink.html" >
or 
<a href="../../../thelink.html" >  
or
<a href="../foo/boo/thelink.html" > 
i need to convert it to full host path like :
( just example .. ) 
<a href="http://www.myhost.com/thelink.html" >
or 
<a href="http://www.myhost.com/foo/boo/thelink.html" >  
or
<a href="http://www.myhost.com/m/thelink.html" > 

有没有办法以编程方式做到这一点?无需手动进行字符串操作

如果你知道 perl 它被称为:如果可能,返回一个相对 URL 来自:http://search.cpan.org/~rse/lcwa-1.0.0/lib/lwp/lib/URI/URL.pm

$url->rel([$base])

无法正常工作的代码示例 (Qt) http://qt.digia.com/support/

QString s("/About-us/");
QString base("http://qt.digia.com");
QString urlForReq;

     if(!s.startsWith("http:"))
            
         QString uu = QUrl(s).toString();
         QString   rurl = baseUrl.resolved(QUrl(s)).toString();
         urlForReq = rurl;
     

urlForReq 值为“/About-us/”

【问题讨论】:

The algorithm to resolve URLs to an absolute URL 由 HTML 标准定义。 【参考方案1】:

我还没有验证@sftrabbit提到的算法是否完全遵循这种方法,但是您可以使用QUrl::resolved将您的相对URL转换为绝对URL:

QUrl base("http://www.myhost.com/m/");
qDebug() << base.resolved(QUrl("thelink.html")).toString();
qDebug() << base.resolved(QUrl("../../../thelink.html")).toString();
qDebug() << base.resolved(QUrl("../foo/boo/thelink.html")).toString();

打印

"http://www.myhost.com/m/thelink.html"
"http://www.myhost.com/thelink.html"
"http://www.myhost.com/foo/boo/thelink.html"

我无法从不适用于 OP 的问题中重现代码示例。唯一的问题是代码中缺少baseUrl 对象。以下SSCCE

#include <QApplication>
#include <QUrl>
#include <QDebug>

int main(int argc, char ** argv) 

    QApplication app( argc, argv );

    QString s("/About-us/");
    QString base("http://qt.digia.com");
    QString urlForReq;
    QUrl baseUrl(base);          // this was missing in the code from the question
    if(!s.startsWith("http:"))        
        QString uu = QUrl(s).toString();
        QString rurl = baseUrl.resolved(QUrl(s)).toString();
        urlForReq = rurl;
    
    qDebug() << "urlForReq:" << urlForReq;

    return 0;

打印

urlForReq: "http://qt.digia.com/About-us/"

【讨论】:

您是否有一些不工作的具体案例,以及实际不工作的案例? :) 好吧,我不能提供真实的站点和信息……我如何在其他公共站点上进行测试?好的,我刚刚尝试使用qt.digia.com/support,如示例中所示 @user63898:你不需要一个实际的站点,只需要一个语法有效的 URL 。使用ftp://files.example.com/this/doesnt/really/exist 很好。 我没有它,我有站点域,我可以用其他 c++ lib 做这个吗?也许是uriparser? 我无法重现您添加到问题中的问题,请参阅我编辑的答案。我得到了预期的输出http://qt.digia.com/About-us/。无论如何,如果您正在寻找 Qt 以外的东西,这篇文章可能会有所帮助:Absolute URL from relative path【参考方案2】:

您应该有您下载的网页的路径,例如http://www.myhost.com/examples/useless/test.html"

取目录前缀prefix = "http://www.myhost.com/examples/useless/"。每个不以/http:// 开头的href 都是相对链接,您使用prefix + link 获得绝对链接。

例如如果链接 =../foo/boo/thelink.html,则结果为http://www.myhost.com/examples/useless/../foo/boo/thelink.html,然后浏览器会将其转换为http://www.myhost.com/examples/useless/boo/thelink.html

【讨论】:

以上是关于Qt或通用c++如何在c++中获取或检测<a href="file.html" >的宿主的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上重新启动 Qt 或 c++ 中的程序?

如何在 C++ 中获取操作系统名称?

使用通用网络摄像头进行对象检测

如何在 C++ 或 Qt 中创建进程?

如何用获取当前鼠标所在窗口的句柄及窗口标题用c或c++?

如何在 C++ 语言中将谷歌地图 API 与 MFC 或 QT 一起使用?