Http网络访问
这次涉及到以下几个类的简单应用
QNetworkAccessManager
QNetworkRequest
QNetworkReply
Qt中的QNetworkAccessManager是异步模式的,需要借助以下两个类转变成类似于同步方式访问
QEventLoop
QTimer
代码
QString MainWindow::getHtmlContent(QString& urlStr){
QNetworkAccessManager mgr ;
QUrl url = QUrl(urlStr);
QNetworkRequest req = QNetworkRequest(url);
QNetworkReply * reply = mgr.get(req);
QByteArray body ;
QEventLoop loop;//靠这个进行等待
QTimer timer;
connect(&timer,&QTimer::timeout,&loop,&QEventLoop::quit);//当网络访问结束时,自动结束等待
connect(&mgr, &QNetworkAccessManager::finished, &loop,&QEventLoop::quit);
timer.start(10000);//用于防止超时,一直不返回
loop.exec();//开始等待
if(timer.isActive()){
timer.stop();//看来是网络访问正常,timer没用上,自己关闭吧
}
if (reply->error() == QNetworkReply::NoError){
body = reply->readAll();//没有发生错误,读取htmlbody
}
QString result = QString(body);
reply->close();
reply->deleteLater();
return result;
}
正则表达式:
QRegExpression
QRegularExpressionMatchIterator
QRegularExpressionMatch
QT的正则表达式,存在多种工作模式,由于本次使用的目的是提取一个网页中多次出现的信息,所以使用了GlobalMatch工作模式.
代码
QString urlStr= "https://www.iiiiiiiiiiiiiiiiiiiii.com/?m=vod-type-id-23.html"; //这个网址就不给出了
QString html = getHtmlContent(urlStr);
// //网页里面会重复出现符合这个模式的信息
//
动态漫画·真理面具更新至02集 国产动漫 2020-10-28//现在的目的是提取
//- 名称: 动态漫画·真理面具更新至02集
//- 地址: /?m=vod-detail-id-66246.html
//- 日期: 2020-10-28
QRegularExpression reg=QRegularExpression("
\\s* \\s*\\s* ([^\\s*\\s* [^\\s*([^\\s*",QRegularExpression::PatternOption::MultilineOption | QRegularExpression::PatternOption::CaseInsensitiveOption);
Q_ASSERT(reg.isValid());
QRegularExpressionMatchIterator matchResult = reg.globalMatch(html);
while(matchResult.hasNext()){//遍历多次出现的匹配
QRegularExpressionMatch oneMatch = matchResult.next();//获取一个匹配
qDebug()<
qDebug()<
qDebug()<
qDebug()<
qDebug()<<:endl>
}
输出的结果类似于:
-------------
名称 : "拾忆长安·明月几时有更新至02集"
地址 : "/?m=vod-detail-id-66252.html"
日期 : "2020-10-28"
-------------
名称 : "别惹流氓兔马修第三季更新至54集"
地址 : "/?m=vod-detail-id-61398.html"
日期 : "2020-10-28"
-------------
名称 : "三魂纪第一季更新至05集"
地址 : "/?m=vod-detail-id-65046.html"
日期 : "2020-10-28"
-------------
名称 : "太子得了失心疯第二季更新至10集"
地址 : "/?m=vod-detail-id-65044.html"
日期 : "2020-10-28"
-------------
名称 : "动态漫画·真理面具更新至02集"
地址 : "/?m=vod-detail-id-66246.html"
日期 : "2020-10-28"
-------------
名称 : "少女前线 人形小剧场第二季更新至05集"
地址 : "/?m=vod-detail-id-65363.html"
日期 : "2020-10-28"
另外,上面的正则表达式,是使用index来获取捕获的,可以改成使用名字.
下面的代码来自于官方文档
QRegularExpression re("(\\d\\d) (?\\w+)");
QRegularExpressionMatch match = re.match("23 Jordan");
if (match.hasMatch()) {
QString number = match.captured(1); // first == "23"
QString name = match.captured("name"); // name == "Jordan"
}
我的代码修改后就是:
QRegularExpression reg=QRegularExpression("
\\s* \\s*\\s* [^\"]+)\"\\s+target\\s*=\\s*\"_blank\"\\s*>(?[^\\s*\\s* [^\\s*(?[^\\s*",QRegularExpression::PatternOption::MultilineOption | QRegularExpression::PatternOption::CaseInsensitiveOption);
获取捕获时,改为
qDebug()<
qDebug()<
qDebug()<