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" >的宿主的主要内容,如果未能解决你的问题,请参考以下文章