题意: 将一些分散在各行的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. linux怎么模糊查找一个文件

    linux如何模糊查找一个文件 在当前目录下搜索指定文件: find . -name test.txt 在当前目录下模糊搜索文件: find . -name '*.txt' 在当前目录下搜索特定属性的 ...

  2. 编写运行R脚本

    1.在后台运行R 1.1 创建file.R文件 1.2 在文件首行键入: #! /path/to/Rscript 1.3 在下面的行中,键入R代码 1.4 保存(记得有png(),jpeg(),... ...

  3. ASP.NET本质论第一章网站应用程序学习笔记1

    1.统一资源标示符 1) 格式:协议://主机[.端口号][绝对路径[?参数]],在Http://www.kencery.com/hyl/index/login中,http表示协议的名称,www.ke ...

  4. Mybatis学习记录(八)----Mybatis整合Spring

    1.整合思路 需要spring通过单例方式管理SqlSessionFactory. spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession.(sp ...

  5. iOS设计模式之观察者模式

    观察者模式 基本理解 观察者模式又叫做发布-订阅(Publish/Subscribe)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时 ...

  6. object-c中的类目,延展,协议

    协议 协议只有方法的声明(类似于其他编程语言的接口)   协议相当于大家都所遵循的 关键字 @protocol 协议名 <所遵循的协议> 默认NSObject   @end     @pr ...

  7. 五种创建UIImage的类方法

    五种创建UIImage的类方法 UIImage有五个类方法,用来创建UIImage的.下面介绍一下每个类方法的作用和创建实例. 1.使用类方法imageNamed:创建 + (UIImage *)im ...

  8. iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例

    使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWRevealViewController实现侧边菜单功能: 1.使用StoryBoard实现   2.纯代 ...

  9. 让eclipse启动时拥有jre

    让eclipse 拥有jre,这样才能启动 eclipse/eclipse.ini 首行加入 -vm /home/liujl/installer/jdk/bin/java

  10. 每日Scrum--No.4

    Yesterday:学习迪杰斯特拉算法并进行简单的编写代码 Today:继续编写代码 Problem:变量名的定义出错,造成调用的时候出错,不过改过来就好了.算法的编写不全面,漏掉个别语句,如在调试的 ...