0

私はシンプルなアプリを持っており、ウェブページからすべてのリンクを取得します。libexml2を使用してhtmlを解析し、httpリクエストのQtQNetworkAccessManager内にあるhtmlリンクを抽出します。ここで問題となるのは、たとえば次のような場合に、リンクのホスト名を自動的に検出する方法です。

<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を知っているなら、それは呼ばれます:可能であれば:http ://search.cpan.org/~rse/lcwa-1.0.0/lib/lwp/lib/URI/URL.pmから相対URLを返します

$ 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/」です。

4

2 に答える 2

2

@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/"
于 2012-10-29T12:58:47.503 に答える
1

ダウンロードしたWebページへのパスが必要ですhttp://www.myhost.com/examples/useless/test.html"

ディレクトリプレフィックスを取りますprefix = "http://www.myhost.com/examples/useless/"。で始まらない、/またはhttp://相対リンクであるすべてのhrefは、を使用して絶対リンクを取得しますprefix + link

たとえば、link =../foo/boo/thelink.htmlの場合、結果はhttp://www.myhost.com/examples/useless/../foo/boo/thelink.html、ブラウザがに変換しhttp://www.myhost.com/examples/useless/boo/thelink.htmlます。

于 2012-10-29T13:02:25.480 に答える