python-70:使用BS4获取正文内容

上一小节咱们学习了find 和 find_all 函数,咱们也知道find_all 函数返回的结果是一个列表,然而咱们并不想要列表,列表不利于咱们查看,因此咱们只能使用find,find会将匹配的结果直接返回,那么find()函数有这么多参数,name,keyword,attrs,text,recursive,咱们须要使用哪一个参数呢?html

咱们来看看网页源码python

 <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
            
  <div class="section" id="beautiful-soup-4-2-0">
<h1>Beautiful Soup 4.2.0 文档<a class="headerlink" href="#beautiful-soup-4-2-0" title="永久连接至标题">¶</a></h1>
<img alt="http://www.crummy.com/software/BeautifulSoup/bs4/doc/_images/6.1.jpg" class="align-right" src="http://www.crummy.com/software/BeautifulSoup/bs4/doc/_images/6.1.jpg" />
<p><a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/">Beautiful Soup</a> 是一个能够从HTML或XML文件中提取数据的Python库.它可以经过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工做时间.</p>
<p>这篇文档介绍了BeautifulSoup4中全部主要特性,并切有小例子.让我来向你展现它适合作什么,如何工做,怎样使用,如何达到你想要的效果,和处理异常状况.</p>
<p>文档中出现的例子在Python2.7和Python3.2中的执行结果相同</p>
<p>你可能在寻找 <a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html">Beautiful Soup3</a> 的文档,Beautiful Soup 3 目前已经中止开发,咱们推荐在如今的项目中使用Beautiful Soup 4, <a class="reference external" href="http://www.baidu.com">移植到BS4</a></p>
<div class="section" id="id1">
<h2>寻求帮助<a class="headerlink" href="#id1" title="永久连接至标题">¶</a></h2>
<p>若是你有关于BeautifulSoup的问题,能够发送邮件到 <a class="reference external" href="https://groups.google.com/forum/?fromgroups#!forum/beautifulsoup">讨论组</a> .若是你的问题包含了一段须要转换的HTML代码,那么确保你提的问题描述中附带这段HTML文档的 <a class="reference internal" href="#id60">代码诊断</a> <a class="footnote-reference" href="#id83" id="id3">[1]</a></p>
</div>
</div>

这是网页源码中正文开始的部分,咱们看到,有<h1>标签,这是标题,还有<p>标签,这是段落,里面则是文章的内容,固然,这只是其中很小很小的部分,咱们想要获取这些内容,须要传入find函数的哪一个参数呢?咱们来一个一个的分析,顺便加深印象函数

  1. name :name参数是针对tag进行操做的,咱们想要获取所有的正文内容的话,就要分别对<h1>,<p>,<li>等标签进行获取,固然确定还会有其余的标签,find('h1')是获取全部<h1>标签的内容,其余的也同样,因此咱们在输出的时候还须要对结果进行整合,这个至关麻烦,根本分不清哪一个标题对应那段文字,因此这个 pass学习

  2. keyword:keyword听说是能够按tag标签的属性进行查找,那我这里能够找到整个正文内容包含在哪一个代码块中,多是class="xxxbody" 或者 id="xxx"等等,我可使用这个参数将整个正文所在的代码块抠出来,这样章节的顺序是不会变化的,这个方法好像可行,可是咱们再看看还有没有更好的方法google

  3. attrs:attrs是针对于匹配一些与关键字相同的字符串,好比import,class等等,这里应该是用不到的url

  4. text:啊,这个根本是想都不用想的好嘛,这个是根据text的字符串来寻找相对应的内容,咱们要传一个字符串进去,而后find函数会寻找含有这个字符串的句子,这彻底跟咱们要实现的功能不搭调的code

  5. recursive:这个参数设置是否遍历某个tag的全部子孙节点,这个好像可使用,咱们只要传入一个tag就能够了嘛,但前提是,你的这个tag必须是惟一的,咱们如今这个网页源码中,正文内容的父节点的tag是<div>,但是,源码中还有不少的<div>,咱们将这个tag传进去的话程序并不知道咱们要寻找的是哪一个<div>里面的子孙节点,程序运行不能达到咱们想要的效果
    htm

因此没办法了,只能使用第二个参数了,如今的问题是,应该传入什么keyword开发

经过对源码的分析,我以为这句代码颇有可能文档

<div itemprop="articleBody">

这个articleBody 的英文看起来好像是文章主题的意思,并且,通常规范的程序为了便于后面的修改和维护,它的函数名或者是关键字都会以相关功能的英文名字来命名,这是阅读程序的一个小技巧,我以为这个articleBody有可能就是咱们要的,因此将代码整理一下,看看结果是什么吧

#!/usr/bin/env python
# -*- coding:UTF-8 -*-
__author__ = '217小月月坑'

'''
获取文章主体
'''

import urllib2
from bs4 import BeautifulSoup

url = 'http://beautifulsoup.readthedocs.org/zh_CN/latest/#'
request = urllib2.Request(url)
response = urllib2.urlopen(request)
contents = response.read()
soup = BeautifulSoup(contents)
# 传入keyword参数
result = soup.find(itemprop="articleBody")
print result

输出结果


好了,结果证实正文部分的代码已经被抠出来了,可是,咱们不能就这样将结果直接写入文件,咱们还要从这段源码中获取正文的内容,也就是那些文字什么的,那好,咱们就来看一下应该使用什么方法来获取正文的内容

相关文章
相关标签/搜索