网页内容爬取:如何提取正文内容 BEAUTIFULSOUP的输出

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

根据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()来实现格式化输出。比如:

view plaincopyprint?

  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对象也可以用于任何标签对象。比如:

view plaincopyprint?

  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代码。

view plaincopyprint?

  1. print(soup.prettify(formatter=None))

输出:

函数格式化

我们可以定义一个函数来处理字符串。比如去掉a字符。

view plaincopyprint?

  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()方法。比如:

view plaincopyprint?

  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代码的方法如下:

view plaincopyprint?

  1. [x.extract() for x in soup_packtpage.find_all(‘script’)]

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

时间: 2024-10-08 01:13:41

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

pyhont---信息的爬取与提取---bs4,BeautifulSoup,re库

pyhont---信息的爬取与提取---bs4,BeautifulSoup,re库 用于对获取到的页面文本进行提取 BeautifulSoup库的理解:BeautifulSoup库是解析.遍历.维护"标签树"的功能库.BeautifulSoup类的基本元素Tag:标签,最基本的信息组织单元,分别使用<></>标明开头和结尾 多个同类标签只访问第一个标签Name:标签的名字,<p>...</p>的名字是p,格式:<tag>.na

Python爬取百度贴吧内容

参考资料:https://cuiqingcai.com/993.html  即 静觅» Python爬虫实战二之爬取百度贴吧帖子 我最近在忙学校的一个小项目的时候涉及到NLP的内容.但是在考虑如何训练的时候却才懂什么叫巧妇难为无米之炊的滋味.中文语料库实在少的可怜,偶尔有一两个带标签的语料库,拿出一看,标注惨不忍睹,都让我怀疑是不是机器标注的.正应了那句话,人工智能,有多少智能就有多少人工. 有什么办法呢,硬着头皮,走一步是一步吧,总比停滞不前要好.项目涉及到帖子,那么我相信不管是谁,首先想到的

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

ajax爬取情况 有时候我们在用 Requests 抓取页面的时候,得到的结果可能和在浏览器中看到的是不一样的,在浏览器中可以看到正常显示的页面数据,但是使用 Requests 得到的结果并没有,这其中的原因是 Requests 获取的都是原始的 HTML 文档,而浏览器中的页面则是页面又经过 JavaScript 处理数据后生成的结果,这些数据的来源有多种,可能是通过 Ajax 加载的,可能是包含在了 HTML 文档中的,也可能是经过 JavaScript 经过特定算法计算后生成的 项目代码如

pyspider解析js爬取(采集)内容案例

PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI.采用 Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器.在线示 例:http://demo.pyspider.org/ 在线手册:http://docs.pyspider.org   如有问题请加入QQ群讨论:217082390 强大的python接口 强大的WEBUI可视化代码编写,任务监控,项目管理和结果查看功能 MySQL, MongoDB,

爬取微信公众号内容——绘制词云

写在前面的话 前段时间写了一篇通过搜狗引擎获取微信公众号的文章,最近又看了一个网易云歌词绘制词云的程序 然后我就想,能否把这两者结合起来呢 还好经历几多波折终于把这个东西给弄出来了. 其实中间的实现不是很难, 关键是环境搭建实在是太困难了 好了,先把代码以及效果图奉献上吧 代码 weixin_spider.py #!/usr/bin/python # coding: utf-8 #这三行代码是防止在python2上面编码错误的,在python3上面不要要这样设置 import sys reloa

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

学会了怎么使用os模块 #!/usr/bin/python# -*- encoding:utf-8 -*- import requestsimport osfrom bs4 import BeautifulSoup def urlBS(url): response = requests.get(url) # print response.encoding #查看request解析的网页的编码 response.encoding = 'utf-8' #requests自动识别的编码有误,强制更改编

python爬虫——爬取小说 | 探索白子画和花千骨的爱恨情仇(转载)

转载出处:药少敏   ,感谢原作者清晰的讲解思路! 下述代码是我通过自己互联网搜索和拜读完此篇文章之后写出的具有同样效果的爬虫代码: 1 from bs4 import BeautifulSoup 2 import requests 3 4 if __name__ == '__main__': 5 html = requests.get('http://www.136book.com/huaqiangu/') 6 soup = BeautifulSoup(html.content, 'lxml'

使用Selenium爬取百度文库word文章

转载请注明作者和出处: http://blog.csdn.net/c406495762 运行平台: Windows Python版本: Python3.x IDE: Sublime text3 前言 问题分析 预备知识 1 Selenium 11 简介 12 安装 13 基础知识 131 小试牛刀 132 模拟提交 133 元素选取 134 界面交互 135 添加User-Agent 2 Xpath 动手实战 1 页面切换 2 内容爬取 3 整体代码 总结 1 前言 大家都应该有过从百度文库下载

Python爬虫实战二之爬取百度贴吧帖子

大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不好使,八成是正则表达式那儿匹配不到了,请更改一下正则,当然最主要的还是帮助大家理解思路. 2016/12/2 本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件 1.URL格式的确定 首先,我们先观察一下百度贴吧的任意一个帖子. 比如:ht