题意: 将一些分散在各行的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. 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)

    题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...

  2. .NET Core常用配置文件示例

    .NET Core相关地址: 1.官网:https://www.microsoft.com/net 2..NET Core:http://dotnet.github.io/3.Getting Star ...

  3. ButterKnife

    1.简介 ButterKnife是注解中相对简单易懂的很不错的开源框架 1.强大的View绑定和Click事件处理功能,简化代码,提升开发效率 2.方便的处理Adapter里的ViewHolder绑定 ...

  4. 【GOF23设计模式】建造者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...

  5. CentOS下apache绑定域名

    本文主要介绍在CentOS下apache绑定域名以及apache绑定多个域名,首先要找到apache的配置文件httpd.conf的位置.CentOS操作系统一般在 /etc/httpd/conf 下 ...

  6. 使用Lucene.NET实现简单的站内搜索

    使用Lucene.NET实现简单的站内搜索 导入Lucene.NET 开发包 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和 ...

  7. SAP技术相关Tcode

    ABAP的常用tcode 开发----------------------------------------------- SE51  屏幕制作 SE91  MESSAGE OBJECT SE80  ...

  8. .NET破解之分享给新注册的朋友

    前些日子,在论坛里看了有人发过这个软件,也有大神分析过网络版,如果是重帖,请删除吧:正好11.11注册了很多新会员,给他们一个见面礼吧,抛砖引玉,我才来论坛的时候,也是看着前人教程慢慢学习的:好久没冒 ...

  9. Java中字节流和字符流的比较(转)

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操 ...

  10. 说说Python多线程中的daemon属性方法

    大家看多线程部分的时候肯定看到过daemon这个属性,当我在百度了一圈后也没发现有比较好的解释(或者大家对这个解释都非常清楚),于是自己通过代码和官方介绍了解它,进行了一些总结 给大家一些参考. 首先 ...