【编程之美10】一个HTML文件,找出里面的正文。

程序员的惊奇之处就是别人用工具学习怎样做的时候,你早已用你的几行代码实现了自己想做的事情~


一个HTML文件,找出里面的正文

“编程之美,让你爱上编程的美。”

挑战下面编程题目,

一起体验编程的乐趣!

本期题目:


一个HTML文件,找出里面的正文

编程之美独有福利:

这个栏目就是为了培养大家编程动手习惯并且提高编程能力的一个平台,我们现如今给参与这个栏目的提供如下福利:
  • 源码分享
  • 每周评比编程之星(奖励牛客大礼包一份,这回是充满惊喜,每个大礼包里不一定包括什么)
  • 企业实习工作机会
  • 独家名誉及待遇
  • 参与开源项目
  • 定期的分享讲座
等等等等!我们想进行一些不一样的玩法,让学习变得更有趣!无论你找到工作与否,即使是已经工作了,你也要有一个练手交流的平台~


当然啦,重要的是来练习自己的编程能力,分享代码,交流技术的过程,这个过程中,你提升的不只是一点点~

为了让牛友能够更高效,更好的学习,特意为大家建了一个群:牛客编程之美源码群 595665246,只给真正想参与这个栏目和真正想学习的人开放,会在群里定期分享源码,只让真正想学习的人来参加,所以只有参与栏目(在本栏目下发出自己的代码的)才能加,加的时候备注一下牛客昵称~

编程之星

每一期的玩法都不一样!每一期的编程之星的规则也不一样~~重要的是人人都参与进来

本期编程之星评比规则:由每个答案的点赞数来决定,点赞数最多的将获得本期编程之星!

注:因为目前群成员比较多,本着只让真正想参与的人进来的原则,可能后期会整理群啦,对这个没有兴趣的我们就会把位置让给真正有兴趣参加的人啦~

栏目介绍

编程之美,是牛客网推出的新栏目,每周推出一个项目供大家练手讨论交流。

如果你有想实现的项目问题,欢迎私信牛妹~

另外!另外!如果有好玩的项目题目可以私信牛妹,一经采用有奖励哦~~

如果你有写博客或者公众号的习惯,也欢迎加牛妹qq:1037532015私信。

参考代码:


#!/usr/bin/env python
#coding: utf-8
from goose import Goose
from goose.text import StopWordsChinese
import sys
reload(sys)
sys.setdefaultencoding(
reload(sys)
sys.setdefaultencoding("utf-8")


# 要分析的网页url
url = 'http://www.ruanyifeng.com/blog/2015/05/thunk.html'
def extract(url):
    '''
    提取网页正文
    '''
    提取网页正文
    '''
    g = Goose({'stopwords_class': StopWordsChinese})
    article = g.extract(url=url)
    
    article = g.extract(url=url)
    return article.cleaned_text


if __name__ == '__main__':
    
    print extract(url)

全部评论
var http = require('http'); var cheerio = require('cheerio'); var url = 'http://www.ruanyifeng.com/blog/2015/05/thunk.html'; /* 展示数据 */ function displayContent(html, array, container) { var $ = cheerio.load(html); container.each(function() { array.push($(this).text().replace('\n', '')); }) console.log('-------------------------分界线------------------------'); console.log(array); } /* 过滤数据 */ function filterContent(html) { var $ = cheerio.load(html); /* 缓存节点 * main_content:文章主体内容 * title:标题 * code:代码示例 * content:内容描述 */ var main_content = $('#main-content'); var title = main_content.find('h2'); var code = main_content.find('.language-javascript'); var content = main_content.find('p'); /* * titleArr:标题 * codeArr:代码 * contentArr:内容 */ var titleArr = []; var codeArr = []; var contentArr = []; displayContent(html, titleArr, title); displayContent(html, codeArr, code); displayContent(html, contentArr, content); /* 数据可以直接打印,为了方便存取,也可将其放入数组中,见displayContent() */ // console.log(title.text()); // console.log('-----------------分割线---------------------'); // console.log(code.text()); // console.log('-----------------分割线---------------------'); // console.log(content.text()); // console.log('-----------------分割线---------------------'); } http .get(url, function(res) { var html = ''; res.on('data', function(data) { html += data; }) res.on('end', function() { filterContent(html); }) }) .on('error', function() { console.log('获取网页内容出错!'); }) 效果截图: 1、所有标题内容: 2、文中代码部分截图: 3、文中文字描述: 这里运用nodejs的http模块,以及cherrio对html页面的内容进行爬取,代码的目录结构为: 不知道是否符合这个题目的要求嘞,,哈哈
点赞
送花
回复
分享
发布于 2017-01-06 22:48
使用了Jsoup html解析库 官方网站:https://jsoup.org/ import java.io.IOException; import java.util.ArrayList; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class NetArticle { private Document doc; public NetArticle(String url) throws IOException { doc = Jsoup.connect(url).get(); } public ArrayList<String> getTitle(int id){ ArrayList<String> titleList = new ArrayList<String>(); Elements elements = doc.getElementsByTag("h"+id); for(Element element:elements){ titleList.add(element.text()); } return titleList; } public String getMainContent(){ return doc.body().getElementById("main-content").text(); } } import java.io.IOException; import java.util.List; public class Client { public static void main(String[] args) throws IOException { NetArticle article = new NetArticle("http://www.ruanyifeng.com/blog/2015/05/thunk.html"); List<String> list = article.getTitle(1); for (String string : list) { System.out.println(string); } System.out.println(article.getMainContent()); } } getTitle()里的数字为几级标题 getMainContent()为获取正文
点赞
送花
回复
分享
发布于 2017-01-08 19:49
秋招专场
校招火热招聘中
官网直投
使用Python Beautiful Soup模块,将Html代码解析成树形结构,对内容进行匹配。 爬取门户网站的新闻标题,作者,时间,内容。 #coding=utf-8 import re # 正则表达式 import bs4 # Beautiful Soup 4 解析模块 import urllib2 # 网络访问模块 import News #自己定义的新闻结构 import codecs #解决编码问题的关键 ,使用codecs.open打开文件 import sys #1解决不同页面编码问题 reload(sys) # 2 sys.setdefaultencoding('utf-8') # 3 # 从首页获取所有链接 def GetAllUrl(home): html = urllib2.urlopen(home).read().decode('utf8') soup = bs4.BeautifulSoup(html, 'html.parser') pattern = 'http://\w+\.baijia\.baidu\.com/article/\w+' links = soup.find_all('a', href=re.compile(pattern)) for link in links: url_set.add(link['href']) def GetNews(url): global NewsCount,MaxNewsCount #全局记录新闻数量 while len(url_set) != 0: try: # 获取链接 url = url_set.pop() url_old.add(url) # 获取代码 html = urllib2.urlopen(url).read().decode('utf8') # 解析 soup = bs4.BeautifulSoup(html, 'html.parser') pattern = 'http://\w+\.baijia\.baidu\.com/article/\w+' # 链接匹配规则 links = soup.find_all('a', href=re.compile(pattern)) # 获取URL for link in links: if link['href'] not in url_old: url_set.add(link['href']) # 获取信息 article = News.News() article.url = url # URL信息 page = soup.find('div', {'id': 'page'}) article.title = page.find('h1').get_text() # 标题信息 info = page.find('div', {'class': 'article-info'}) article.author = info.find('a', {'class': 'name'}).get_text() # 作者信息 article.date = info.find('span', {'class': 'time'}).get_text() # 日期信息 article.about = page.find('blockquote').get_text() pnode = page.find('div', {'class': 'article-detail'}).find_all('p') article.content = '' for node in pnode: # 获取文章段落 article.content += node.get_text() + '\n' # 追加段落信息 SaveNews(article) print NewsCount break except Exception as e: print(e) continue else: print(article.title) NewsCount+=1 finally: # 判断数据是否收集完成 if NewsCount == MaxNewsCount: break def SaveNews(Object): file.write("【"+Object.title+"】"+"\t") file.write(Object.author+"\t"+Object.date+"\n") file.write(Object.content+"\n"+"\n") url_set = set() # url集合 url_old = set() # 爬过的url集合 NewsCount = 0 MaxNewsCount=3 home = 'http://baijia.baidu.com/' # 起始位置 GetAllUrl(home) file=codecs.open("D:\\test.txt","a+") #文件操作 for url in url_set: GetNews(url) # 判断数据是否收集完成 if NewsCount == MaxNewsCount: break file.close() 运行结果。 需要注意的问题: 爬区内容编码方式的问题。编码utf-8,但是存的时候ascii操作,到本地打开会是乱码,建议使用reload(sys)  操作。 Git地址: https://github.com/EStormLynn/Python-Spider 感谢群里热心的小伙伴的解答,git新人不容易呀。23333~
点赞
送花
回复
分享
发布于 2017-01-08 19:21
#include <iostream> #include <netdb.h> #include <string.h> #include <stdlib.h> using namespace std; void parseHostAndPagePath(const string url, string &hostUrl, string &pagePath) { hostUrl=url; pagePath="/"; int pos=hostUrl.find("http://"); if(-1!=pos) hostUrl=hostUrl.replace(pos,strlen("http://"),""); pos=hostUrl.find("https://"); if(-1!=pos) hostUrl=hostUrl.replace(pos,strlen("https://"),""); pos=hostUrl.find("/"); if(-1!=pos) { pagePath=hostUrl.substr(pos); hostUrl=hostUrl.substr(0,pos); } } string getPageContent(const string url) { struct hostent *host; string hostUrl, pagePath; parseHostAndPagePath(url, hostUrl, pagePath); if(NULL == (host = gethostbyname(hostUrl.c_str()))) { cout<<"gethostbyname error\n"<<endl; exit(1); } struct sockaddr_in pin; int port=80; bzero(&pin,sizeof(pin)); pin.sin_family=AF_INET; pin.sin_port=htons(port); pin.sin_addr.s_addr=((struct in_addr*)(host->h_addr))->s_addr; int isock; if((isock = socket(AF_INET, SOCK_STREAM, 0))==-1) { cout<<"open socket error\n"<<endl; exit(1); } string requestHeader; requestHeader="GET "+pagePath+" HTTP/1.1\r\n"; requestHeader+="Host: "+hostUrl+"\r\n"; requestHeader+="Accept: */*\r\n"; requestHeader+="User-Agent: Mozilla/4.0(compatible)\r\n"; requestHeader+="connection:Keep-Alive\r\n"; requestHeader+="\r\n"; if(connect(isock, (const sockaddr*)&pin, sizeof(pin))==-1) { cout<<"connect error\n"<<endl; exit(1); } if(send(isock, requestHeader.c_str(), requestHeader.size(), 0)==-1) { cout<<"send error\n"<<endl; exit(1); } struct timeval timeout={1,0}; setsockopt(isock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval)); int len, BUFFER_SIZE=1024; char buffer[BUFFER_SIZE]; string pageContent=""; while((len = recv(isock, buffer, BUFFER_SIZE-1, 0))>0) { buffer[len]='\0'; pageContent+=buffer; } int startpos = 0, endpos = 0; startpos=pageContent.find("<body"); pageContent = pageContent.substr(startpos); startpos=pageContent.find(">"); endpos=pageContent.find("</body>"); string pageBody = pageContent.substr(startpos+1,endpos-startpos-1); return pageBody; } int main() { cout<< getPageContent("http://www.sohu.com") << endl; return 0; }
点赞
送花
回复
分享
发布于 2017-01-08 10:35
牛妹,我想问问牛客网笔试时候,后台能看到屏幕内容吗?因为我有次笔试的时候,因为输出格式不对,在牛客网的帖子里询问过他人。
点赞
送花
回复
分享
发布于 2017-09-05 13:55

相关推荐

祈求顺利毕业😁:简历很好了,多投吧牛油😂。主要是环境不好,大家也卷
点赞 评论 收藏
转发
点赞 6 评论
分享
牛客网
牛客企业服务