这是一个家庭作业,因此我希望你们不给我直接的答案/代码,但引导我找到解决方案。
我的问题是,我有这个XXX.html文件,里面有成千上万的代码。但我需要的是提取这部分:
<html>
...
<table>
<thead>
<tr>
<th class="xxx">xxx</th>
<th>xxx</th> <th>xxx</th> </tr>
</thead>
<tbody>
<tr class=xxx>
<td class="xxx"><a href="xxx" >ZZZ ZZ ZZZ</a></td>
<td>ZZZZ</td> <td class="xxx">ZZZZ</td> </tr> <tr class=xxx>
<td class="xxx"><a href="xxx" >ZZZ ZZ ZZZ</a></td>
<td>ZZZZ</td> <td class="xxx">ZZZZ</td> </tr> <tr class=xxx>
<td class="xxxx"><a href="xxxx" >ZZZ ZZ ZZZ</a></td>
<td>ZZZZ</td> <td class="xxxx">zzzz</td> </tr> <tr class=xxx>
<td class="xxx"><a href="xxxx" >ZZZ ZZ ZZZ</a></td>
... and so on
这是我目前的代码:
// after open the file
while(!fileOpened.eof()){
getline(fileOpened, reader);
if(reader.find("ZZZ")){
cout << reader << endl;
}
}
“reader”是一个字符串变量,我想为HTML文件的每一行保存。如果ZZZZ的值,因为我需要生效,值会改变,我应该使用什么方法而不是使用“find”方法? (我真的很抱歉,因为没有提到这一部分)
但是不显示我想要的值,而是显示html文件的其他部分。为什么?我的方法错了吗?如果我的方法错了,我该如何提取ZZZZZ值?
答案 0 :(得分:3)
std::string::find
不返回布尔值。如果成功则返回子字符串匹配的字符串中的索引,否则返回std::string::npos
。
所以你想说:
if (reader.find("ZZZ") != std::string::npos){
cout << reader << endl;
}
答案 1 :(得分:0)
通常,使用字符串匹配不能从HTML文件中提取值。需要一个合适的HTML解析器 - 它们可以作为标准代码用于C ++。
否则我建议使用正则表达式库(boost :: regex,直到C ++ 0x出来)。您将能够编写更好的表达式来捕获您感兴趣的文件部分。
按行读取可能不起作用,因为HTML文件可能是一个大行。然后输出您找到的每一行将只发出整个文件。因此,尝试正则表达式并查找代码的小部分并输出它们。正则表达式库将具有“全部匹配”命令(我忘记了确切的名称)。
答案 2 :(得分:0)
从文件中读取行的框架代码应如下所示:
if( !file.good() )
throw "opening file failed!";
for(;;) {
std::string line;
std::getline(file, line);
if( !file.good() )
break;
// reading succeeded, process line
}
if(!file.eof())
// error before reaching EOF
(那个看起来很有趣的循环是在循环中间检查结束条件的循环。在C ++中没有这样的东西,所以你必须使用一个中间休息的无限循环。)
但是,正如我在对您的问题的评论中所说的那样,逐行阅读HTML代码并不一定有用,因为HTML不依赖于特定的空格。