创建一个新网站,一开始没有内容,通常需要抓取其他人的网页内容,一般的操作步骤如下:

根据url下载网页内容,针对每个网页的html结构特征,利用正则表达式,或者其他的方式,做文本解析,提取出想要的正文。

为每个网页写特征分析这个还是太耗费开发的时间,我的思路是这样的。

Python的BeautifulSoup包大家都知道吧,

import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html)

利用这个包先把html里script,style给清理了:

[script.extract() for script in soup.findAll('script')]
[style.extract() for style in soup.findAll('style')]

清理完成后,这个包有一个prettify()函数,把代码格式给搞的标准一些:

soup.prettify()

然后用正则表达式,把所有的HTML标签全部清理了:

reg1 = re.compile("<[^>]*>")
content = reg1.sub('',soup.prettify())

剩下的都是纯文本的文件了,通常是一行行的,把空白行给排除了,这样就会知道总计有多少行,每行的字符数有多少,我用excel搞了一些每行字符数的统计,如下图:

x坐标为行数,y坐标为该行的字符数

很明显,会有一个峰值,81~91行就应该是这个网页的正文部分。我只需要提取81~91行的文字就行了。

问题来了,照着这个思路,有什么好的算法能够通过数据分析的方式统计出长文本的峰值在哪几行?

BeautifulSoup不仅仅只是可以查找,定位和修改文档内容,同样也可以用一个好的 格式进行输出显示。BeautifulSoup可以处理不同类型的输出:

  • 格式化的输出
  • 非格式化的输出

格式化输出

 
BeautifulSoup中有内置的方法prettfy()来实现格式化输出。比如:
  1. from bs4 import BeautifulSoup
  2. html_markup = “””<p class=”ecopyramid”>
  3. <ul id=”producers”>
  4. <li class=”producerlist”>
  5. <div class=”name”>plants</div>
  6. <div class=”number”>100000</div>
  7. </li>
  8. <li class=”producerlist”>
  9. <div class=”name”>algae</div>
  10. Output in Beautiful Soup
  11. <div class=”number”>100000</div>
  12. </li>
  13. </ul>”””
  14. soup = BeautifulSoup(html_markup,“lxml”)
  15. print(soup.prettify())

输出:

 
 
prettify()可以用于BeautifulSoup对象也可以用于任何标签对象。比如:
  1. producer_entry = soup.ul
  2. print(producer_entry.prettify())

非格式化输出

 
可以使用str()和unicode()来进行非格式化输出。
如果我们对BeautifulSoup对象和标签对象使用str()方法,那么得到的就是一般的字符串输出样式。
我们也可以使用前篇讲到的encode()方法来指定编码格式的输出。
对BeautifulSoup对象或标签对象使用decode()方法来得到Unicode字符串。
 

BeautifulSoup中的输出格式化

 
HTML实体编码可以放进HTML文档中用来表示特别的字符和标识。这些标识不存在于键盘上,这些HTML实体编码只是当浏览器打开后才回看到效果。
在输出方法中,只有这几个HTML编码有点例外。>和<和&三个符号。除此之外其他的特别标识都是被转换成Unicode编码当创建BeautifulSoup对象时,且当使用Prettify()方法或者其他方法输出时,我们只能得到UTF-8格式的字符串。
 
html_markup = “””<html>
<body>& &amp; ampersand
¢ &cent; cent
© &copy; copyright
÷ &divide; divide
> &gt; greater than
</body>
</html>
 
输出:

 
可以看到两个没有被转换。BeautifulSoup自带的输出格式器来控制输出。输出格式器有以下几种类型。
  • miimal
  • html
  • None
  • function
我们可以在输出方法中传递上述输出格式器参数,如prettify(),ncode(),decode()

miimal格式化

 
在这种格式化模式下,字符串被处理成一个有效的HTML代码。这是默认的格式化输出,此时输出结果就和前面的一样。不能转换&amp;, &gt;和&lt;
 

Html格式化

 

这种格式化模式下,BeautifulSoup将会将Unicode字符转换成HTML编码形式。
print(soup.prettify(formatter=”html”))

输出:
 
 

None格式化

 
这种情况下,BeautifulSoup不会改变字符串。这会导致产生一个非法的HTML代码。
  1. print(soup.prettify(formatter=None))

输出:

 
 

函数格式化

 
我们可以定义一个函数来处理字符串。比如去掉a字符。
 
  1. def remove_chara(markup):
  2. return markup.replace(“a”,””)
  3. soup = BeautifulSoup(html_markup,“lxml”)
  4. print(soup.prettify(formatter=remove_chara))

输出:

 
注意,其中字符a被替换掉了,但是注意的是&amp;, &gt;,和&lt;也被转换了。
 

使用get_text()

 
从网页中得到文本是常见的工作,BeautifulSoup提供了get_text()方法来达到目的。
 
如果我们只想得到BeautifulSoup对象的文本或标签对象的文本内容,我们可以使用get_text()方法。比如:
  1. html_markup = “””<p class=”ecopyramid”>
  2. <ul id=”producers”>
  3. <li class=”producerlist”>
  4. <div class=”name”>plants</div>
  5. <div class=”number”>100000</div>
  6. </li>
  7. <li class=”producerlist”>
  8. <div class=”name”>algae</div>
  9. <div class=”number”>100000</div>
  10. </li>
  11. </ul>”””
  12. soup = BeautifulSoup(html_markup,“lxml”)
  13. print(soup.get_text())

输出:

plants
100000
algae
100000
 
get_text()方法返回BeautifulSoup对象或标签对象中的文本内容,其为一个Unicode字符串。但是get_text()有个问题是它同样也会返回javascript代码。

 
去掉javascript代码的方法如下:
  1. [x.extract() for x in soup_packtpage.find_all(‘script’)]

这样就会用处掉所有脚本元素。

网页内容爬取:如何提取正文内容 BEAUTIFULSOUP的输出的更多相关文章

  1. scrapy(四): 爬取二级页面的内容

    scrapy爬取二级页面的内容 1.定义数据结构item.py文件 # -*- coding: utf-8 -*- ''' field: item.py ''' # Define here the m ...

  2. Scrapy 框架 使用 selenium 爬取动态加载内容

    使用 selenium 爬取动态加载内容 开启中间件 DOWNLOADER_MIDDLEWARES = { 'wangyiPro.middlewares.WangyiproDownloaderMidd ...

  3. 帝国CMS批量提取正文内容到简介

    最近接到一个帝国CMS模板改版项目,自带的数据可能是采集的,以前的简介字段内容只截取了60个字,新模板的简介60字符太少了,不美观,想让简介都截取200个字,怎么批量修改呢,文章太多了手动改肯定不行, ...

  4. Python写网络爬虫爬取腾讯新闻内容

    最近学了一段时间的Python,想写个爬虫,去网上找了找,然后参考了一下自己写了一个爬取给定页面的爬虫. Python的第三方库特别强大,提供了两个比较强大的库,一个requests, 另外一个Bea ...

  5. Python 基础语法+简单地爬取百度贴吧内容

    Python笔记 1.Python3和Pycharm2018的安装 2.Python3基础语法 2.1.1.数据类型 2.1.1.1.数据类型:数字(整数和浮点数) 整数:int类型 浮点数:floa ...

  6. Python 爬虫 ajax爬取马云爸爸微博内容

    ajax爬取情况 有时候我们在用 Requests 抓取页面的时候,得到的结果可能和在浏览器中看到的是不一样的,在浏览器中可以看到正常显示的页面数据,但是使用 Requests 得到的结果并没有,这其 ...

  7. java 如何爬取百度百科词条内容(java如何使用webmagic爬取百度词条)

    这是老师所布置的作业 说一下我这里的爬去并非能把百度词条上的内容一字不漏的取下来(而是它分享链接的一个主要内容概括...)(他的主要内容我爬不到 也不想去研究大家有好办法可以call me) 例如 互 ...

  8. 使用Python爬取网页的相关内容(图片,文字,链接等等)

    代码解释的很详细了,有不明白的欢迎评论 ~~~滑稽 import requests from bs4 import BeautifulSoup # #获取图片 输入网址 req=requests.ge ...

  9. python爬虫:爬取读者某一期内容

    学会了怎么使用os模块 #!/usr/bin/python# -*- encoding:utf-8 -*- import requestsimport osfrom bs4 import Beauti ...

随机推荐

  1. 怎样删除Tomcat下已经部署的项目

    lz说的是把web项目部署到tomcat之中,要把它删除..很简单,找到webapps文件(tomcat的根目录)下把它删除即可.. 2.Tomcat 6.0\webapps\项目名 只要在把这个目录 ...

  2. 对一个deb包的解压、改动、又一次打包全过程方法

    /*********************************************************************  * Author  : Samson  * Date   ...

  3. Win10還原成最乾淨的狀態

    系統不穩定時我們想到的第一個選擇就是重灌,如果你的作業系統是win10將會有另外一個新選擇,就是透過程式進行還原,讓你的電腦回到剛安裝時的清爽. 工具資訊 [軟體名稱]微軟 Refresh Windo ...

  4. android账号与同步之账号管理

    在android提供的sdk中,samples文件夹下有一个叫SampleSyncAdapter的演示样例,它是一个账号与同步的实例,比方Google原始的android手机能够使用Google账号进 ...

  5. Mariadb 索引及外键

    索引 索引相当于一本书的目录,在一个数据库或表有索引的情况下,会很便于查询数据,使查询更加效率,相对的也有缺点,不利于去修改,比较麻烦,有索引便于查询,那就意味着索引创建的越多越好么?然而并不是:索引 ...

  6. 浅谈MySQL load data local infile细节 -- 从源码层面

    相信大伙对mysql的load data local infile并不陌生,今天来巩固一下这里面隐藏的一些细节,对于想自己动手开发一个mysql客户端有哪些点需要注意的呢? 首先,了解一下流程: 3个 ...

  7. [NOI2015Day1]解题报告

    今天一起做NOI的题. 我仅仅想说SunshinAK了好神啊. T3数据好坑啊,打表竟然被编译环境卡掉了... T1:程序自己主动分析 (http://www.lydsy.com/JudgeOnlin ...

  8. poj 3233(矩阵高速幂)

    题目链接:http://poj.org/problem?id=3233. 题意:给出一个公式求这个式子模m的解: 分析:本题就是给的矩阵,所以非常显然是矩阵高速幂,但有一点.本题k的值非常大.所以要用 ...

  9. cnn,rnn,dnn

    CNN(卷积神经网络).RNN(循环神经网络).DNN(深度神经网络)的内部网络结构有什么区别? https://www.zhihu.com/question/34681168 CNN(卷积神经网络) ...

  10. Enterprise Library 5.0 学习笔记

    近期了解了微软提供的企业开发框架Enterprise Library,眼下最新版本号是6.0,可是不支持FW3.5.所以就学习了5.0的版本号,EL5.0支持FW3.5和4.0,官网下载地址是:htt ...