qt 正则 html,QT之http网络访问和正则表达式 2020-10-31

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()<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值