zoukankan      html  css  js  c++  java
  • python 之readability与BeautifulSoup

     以前要采集某个网页,一般做法是写程序源代码爬出来,然后用正则去匹配出来,这种针对指定的网页去爬效果还可以,但是如果是批量的网页这种实现就会变得不现实,在这时候就有readability出手的意义了,readability能迅速将内容爬取出来,其他的有几种库也可以,这里就不比较了但是我觉得这个挺好用的。接着说,用pip 安装好readability模块就可以使用了。代码如下

    html = urllib.urlopen("http://www.cnblogs.com/EncryptingLife/p/5156263.html").read()
    readable_article = Document(html).summary()
    readable_title = Document(html).short_title()
    

     这个时候readable_article就是爬取的内容,按照常例写正则匹配,前面已经说过了这种方式不适合大量的页面,

    BeautifulSoup 非常强大可以用来找出对应的东西不需要写正则。官方文档是:

    http://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/#id5

    简单的说说里面的几种用法吧。

      soup =BeautifulSoup(readable_article,"lxml")

    1.按照标签来获取

      eg:

        1.tag = soup.p

        这个会获取p标签的内容 如果直接打印的话会显示为第一个p元素的值

        2.tag = soup.head

        这个获取head里面的内容

    2.用css选择器来获取

      eg:

        1.soup.select(".python")

         这里会查找所有class为python的元素,ID直接是soup.select("#python")

        2.

          

    z=soup.select("p > a")
    for a in z:
    	print a.get("href")
    

          这个可以把p标签下的a标签全部取出来,然后获取它的url

        3.soup.find_all("p", class_="body strikeout")

    3.取文本的可以使用soup.get_text()

        这里会取出里面所有的文本

    4.find() 与find_all()

      eg

      1.soup.find('head')

        这个会查找head

      2.soup.find_all('b')

        这个是查找所有的b元素

      3.传递方法

        也可以是这样的:

          def has_class_but_no_id(tag): return tag.has_attr('class') and not tag.has_attr('id')

      4.也可以用正则

        for tag in soup.find_all(re.compile("^b")):

          print(tag.name)

      5.也可以传递列表这时候会匹配出符合其中一个条件的项相当于或者

        soup.find_all(["a", "b"])

        这个会查找所有a标签与b标签

      6.还可以有如下几种形式

        soup.find_all(id="link2")

        soup.find_all("p", "title")

        soup.find_all("title")

        soup.find_all(href=re.compile("elsie"))

    5.还有几种类似jquery的写法

      first_link.find_next_siblings("a")

      last_link = soup.find("a", id="link3")

      last_link  # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

      last_link.find_previous_siblings("a")

      这时候会查找到符合前面条件的兄弟节点

      下面这个可以查找父元素

      

      title_tag = soup.title

      title_tag # <title>The Dormouse's story</title>

      title_tag.parent

      # <head><title>The Dormouse's story</title></head>

    暂时就写到这里

  • 相关阅读:
    SPOJ1007 VLATTICE
    hdu 4746Mophues[莫比乌斯反演]
    [Offer收割]编程练习赛13 B.最大子矩阵[枚举]
    [SCOI2011]飞镖[数学模拟]
    2333: [SCOI2011]棘手的操作[离线线段树]
    hdu3507 Print Article[斜率优化dp入门题]
    react 日期
    使用arc进行code review
    css冲突2 要关闭的css在项目代码以外,但是是通过<link>标签引入的css(例如bootstrap):解决方法,在APP.css中使用全局样式
    <svg>标签
  • 原文地址:https://www.cnblogs.com/EncryptingLife/p/5159052.html
Copyright © 2011-2022 走看看