题意: 将一些分散在各行的HTML代码整理成标签树的形式。

解法: 模拟,具体见代码的讲解。 开始没考虑 '\t' 。。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std; string S,tmp,pre; int main()
{
int t,i,j,cs = ;
scanf("%d",&t);
getchar();
pre = "";
while(t--)
{
S = "";
int fir = ; //是否是第一个子串
while()
{
getline(cin,tmp,'\n');
if(fir) { tmp = pre + tmp; S = S + tmp; fir = ; } //如果是第一个子串,看有没有遗留在前面case的部分
else S = S + " " + tmp;
int ls = S.length();
int lt = tmp.length();
int tag = ;
for(i=;i<=lt-;i++) //读入
{
if(tmp.substr(i,) == "</html>")
{
S = S.substr(,ls-lt+i+);
pre = tmp.substr(i+,lt-i-);
tag = ;
break;
}
}
if(!tag) break;
}
int len = S.length(), deep = ;
printf("Case #%d:\n",cs++);
for(i=;i<len;i++) if(S[i] == '\t') S[i] = ' '; //把Tab转换掉
//cout<<"S = "<<S<<endl;
for(i=;i<len;i++)
{
if(S[i] == '<') //标签部分
{
if(S[i+] != '/') deep++; // 1.开标签,深度+
else deep--; // 2.闭标签,深度-
for(j=;j<deep-(S[i+]=='/'?:);j++) printf(" "); //如果是闭标签,不用减一个空格,否则要建一个空格输出,因为开始就deep++了
if(S[i+] != '/') //如果是类似 <hr/> 的空标签,deep--抵消开标签的deep++
{
for(j=i;S[j]!='>' && j < len;j++);
if(S[j-] == '/') deep--;
}
for(i;S[i]!='>';i++) cout<<S[i]; //输出标签内容
cout<<">"<<endl;
}
else //正文部分,空格地方小心处理
{
string buf = ""; //缓冲部分
int letter = ;
while(S[i] != '<' && i < len)
{
if(S[i] == ' ') //除掉文字前面的空格
{
while(S[i] == ' ' && i < len) i++;
i--;
}
if(S[i] == ' ' && (S[i+] == '<' || !letter)) { i++; continue; } //如果文本全是空格,i++,继续
letter = ; //否则,有字母
buf += S[i]; //推进缓冲区
i++;
}
if(letter) //如果文本有内容
{
for(j=;j<deep;j++) printf(" "); //再打deep个空格
cout<<buf; //输出缓冲区内容
puts("");
}
i--;
}
}
}
return ;
}

HDU 4782 Beautiful Soup --模拟的更多相关文章

  1. hdu - 4782 - Beautiful Soup(模拟)

    题意:输出一堆乱排版的html标签,去多余空字符,转换为按缩进输出. 题目链接:pid=4782">http://acm.hdu.edu.cn/showproblem.php?pid= ...

  2. HDU 4782 Beautiful Soup (模拟+注意细节)

    思路就是用栈模拟,不用开实体的栈,直接记一个top指针就行. 说说这题的细节: 1.tag标签里的内容不要动,原样输出.比如<p aa bb cc>,就这样输出就行,不要删空格.题目中说了 ...

  3. hdu 4782 Beautiful Soupz

    模拟.其实这题就是题目比较长而已...读完题目就差不多了.tag直接读就可以了,题目说了不用修改.然后整个题目就是让求text部分,严格按空格分开.注意每行前面空格个数. #include<al ...

  4. python爬虫之Beautiful Soup的基本使用

    1.简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索 ...

  5. 100天搞定机器学习|Day21 Beautiful Soup

    前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...

  6. 爬虫---Beautiful Soup 反反爬虫事例

    前两章简单的讲了Beautiful Soup的用法,在爬虫的过程中相信都遇到过一些反爬虫,如何跳过这些反爬虫呢?今天通过知乎网写一个简单的反爬中 什么是反爬虫 简单的说就是使用任何技术手段,阻止别人批 ...

  7. 使用Beautiful Soup编写一个爬虫 系列随笔汇总

    这几篇博文只是为了记录学习Beautiful Soup的过程,不仅方便自己以后查看,也许能帮到同样在学习这个技术的朋友.通过学习Beautiful Soup基础知识 完成了一个简单的爬虫服务:从all ...

  8. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(1): 基础知识Beautiful Soup

    开始学习网络数据挖掘方面的知识,首先从Beautiful Soup入手(Beautiful Soup是一个Python库,功能是从HTML和XML中解析数据),打算以三篇博文纪录学习Beautiful ...

  9. Python爬虫学习(11):Beautiful Soup的使用

    之前我们从网页中提取重要信息主要是通过自己编写正则表达式完成的,但是如果你觉得正则表达式很好写的话,那你估计不是地球人了,而且很容易出问题.下边要介绍的Beautiful Soup就可以帮你简化这些操 ...

随机推荐

  1. Visual Studio图片注释image-comments扩展

            有一个开源的Visual Studio小工具image-comments,它用于在源代码注释中插入图片,您可以到这儿下载.目前支持Visual Studio 2010/2012 Sta ...

  2. Play 可以做的 5 件很酷的事

    Play 可以做的 5 件很酷的事 本章译者:@Playframwork 通过 5 个实例,透视 Play 框架背后的哲学. 绑定 HTTP 参数到 JAVA 方法参数 用 Play 框架,在 Jav ...

  3. Vue自带的过滤器

    gitHub地址:https://github.com/lily1010/vue_learn/tree/master/lesson05 一 过滤器写法 {{ message | Filter}} 二 ...

  4. 类型“GridView”的控件“GridView1”必须放在具有 runat=server 的窗体标记内。

    错误的写法:  if (this.GridView1.Rows.Count > 0)         {             string style = @"<style& ...

  5. 【读书笔记】iOS-GCD-多线程编程

    一,现在一个物理的CPU芯片实际上有64个(64核)CPU,如果1个CPU核虚拟为两个CPU核工作,那么一台计算机上使用多个CPU核就是理所当然的事了.尽管如此,“1个CPU核执行的CPU命令为一条无 ...

  6. macbook pro 重装系统

    重装前系统版本:10.11.6 因为我在系统更新时强行关机,后来在编译代码的时候就一直有奇怪的错误,所以选择重装系统. 前提条件:一定要有网络 1.关机状态下按住command + r ,按一下开机键 ...

  7. IOS开发关于测试的好的网址资源

    1. 高级自动化单元测试,推荐看LeanCloud 工程师的李智维的自动化单元测试的直播录影李智维的演示github 2.iOS开发-单元测试 这只是一篇简单的ios测试介绍 3.iOS单元测试 来自 ...

  8. IPv4中IP地址分类

    分三个部分进行讲述: 1 五类IP 2 特殊用途的IP 3 私有IP 1 五类IP IPV4简单粗暴地把IP地址分为五类.分类方法如下图所示: 也就是说,分为以下几类: A: 0.0.0.0-127. ...

  9. Homebrew OS X 不可或缺的套件管理器

    Homebrew OS X 不可或缺的套件管理器,可以说Homebrew就是mac下的apt-get.yum. 1.安装homebrew brew的安装很简单,使用一条ruby命令即可,Mac系统上已 ...

  10. SAM4E单片机之旅——17、通过UART进行标准IO

    交互还是很有必要的,而且使用键盘和显示器的交互效率还是很高的.当然,可以直接使用UART进行字符的输入和输出.但是又何必浪费了C的标准输入输出的格式控制之类的功能呢? 这次内容就是使用scanf() ...