看板 C_and_CPP 關於我們 聯絡資訊
我的開發平台是 win7 工具是QT Creator 版本是Qt Core 5.15.2 我用QNetworkReply 去收網頁內容並且分析 網頁是很固定的純文字內容 本來爬得很順利的 以下是程式碼 m_PageRequest.setUrl(QUrl{urlString}); QNetworkReply *reply = m_Manager.get(m_PageRequest); QEventLoop event_loop; QObject::connect(reply, SIGNAL(finished()), &event_loop, SLOT(quit())); event_loop.exec(); QString headLine{reply->readLine()}; if(headLine.contains(SUCCESSED_HEADLINE)){ for(int i{0};i<23;i++) //我要的資料在剩下的第24行 reply->readLine(); QString raw{reply->readLine()}; parse(raw); } 但是網頁的文字裡面包含某一個特定的名字的時候 程式就會出錯。 這個名字從網頁看起來只有三個字 XXX 把它複製上PTT來看也的只有三個字 XXX 但是在chorme的檢視網頁原始碼裡面就變成 XX X 中間空了一個空白 https://imgur.com/rH0j2nP 左邊/uploader/後面那一串就是他的名字網頁編碼 本來正常情況下uploader後面還有資料是我需要的 但是只要遇到這個名字,字串卻只有到名字中間的空白,空白後面的資料都沒了 本來以為是跑到下一行,但並沒有。 現在文章打到一半我在想是不是 QString raw{reply->readLine()}; 在readLine() 的資料轉換成 QString的時候,把那個空白當作結束符號 後面的就沒有copy到raw 這個QString裡面了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.192.225.144 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1639195976.A.7FF.html ※ 編輯: liu2007 (123.192.225.144 臺灣), 12/11/2021 12:14:44
nh60211as: %00 是 null terminator ㄅ,我猜你說的空格其實就是 12/11 12:27
nh60211as: '\0',所以readline()讀到這就覺得讀完了 12/11 12:27
ba: 50524 rba: 14367 reply->readLine()的ByteArray size = 50524 QString raw{reply->readLine()}; raw.toUtf8().size = 14367 看來要找怎麼拔ByteArray裡的結束字元的方法了..... ※ 編輯: liu2007 (123.192.225.144 臺灣), 12/11/2021 12:46:39
nh60211as: 我講錯了,是QString(QByteArray)建構的時候讀到'\0' 12/11 13:15
nh60211as: 覺得讀完了 12/11 13:15
QByteArray ba{reply->readLine()}; QByteArray nba; foreach(char c, ba){ if (c != '\0') nba.push_back(c); } QString raw{nba}; ※ 編輯: liu2007 (123.192.225.144 臺灣), 12/11/2021 13:34:12
nh60211as: 我猜用 QByteArray::replace() 就好,如果你不打算 12/11 13:56
nh60211as: 把'\0' 當作他名字的一部分也可以先把整個文件讀起來 12/11 13:57
nh60211as: 先把'\0'通通清掉,再用你一開始一行一行讀的方法 12/11 13:58