zoukankan      html  css  js  c++  java
  • python 使用 BeautifulSoup 解析html

    下载地址:http://www.crummy.com/software/BeautifulSoup/bs4/download/4.3/beautifulsoup4-4.3.2.tar.gz

    说明:这个版本使用python 2.7比较好。

    install: 解压缩,然后运行python setup.py install

    linux系统还可以:sudo apt-get install Python-bs4

    还可以:pip install beautifulsoup4

    官方文档:

    http://www.crummy.com/software/BeautifulSoup/bs4/doc/

    (也可以使用 pyQuery)

    使用

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html_str, 'html.parser')

    输出文档

    with open('test.html', 'w') as f:
        f.write(soup.prettify().encode('utf-8'))

    当你调用__str__,prettify或者renderContents时, 你可以指定输出的编码。默认的编码(str使用的)是UTF-8。 下面是处理ISO-8851-1的串并以不同的编码输出同样的串的例子。 soup.__str__("ISO-8859-1")

    四大对象种类

    Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

    • Tag: 对于 Tag,它有两个重要的属性,是 name 和 attrs
    • NavigableString: 获取标签内部的文字
    • BeautifulSoup:you can treat it as a Tag object
    • Comment:获取注释 <!-- comment -->

    Tag:

    • print type(soup.a)
      #<class 'bs4.element.Tag'>
      print soup.p.attrs
      #{'class': ['title'], 'name': 'dromouse'}
    • css_soup = BeautifulSoup('<p class="body strikeout"></p>')
      css_soup.p['class']
      # ["body", "strikeout"]

    NavigableString:

    • print soup.p.string
      #The Dormouse's story

    足够有用:

    soup.title
    # <title>The Dormouse's story</title>
    
    soup.title.name
    # u'title'
    
    soup.title.string
    # u'The Dormouse's story'
    
    soup.title.parent.name
    # u'head'
    
    soup.p
    # <p class="title"><b>The Dormouse's story</b></p>
    
    soup.p['class']
    # u'title'
    
    soup.a
    # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
    
    soup.find_all('a')
    # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
    #  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
    #  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
    print soup.find("a", attrs={"class": "sister"}) #只找第一个
    print soup.find_all("a", attrs={"class": "sister"}, limit=2)
    import re
    soup.find(string=re.compile("sisters"))
    soup.find(id="link3")
    # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
    head_tag.contents
    [<title>The Dormouse's story</title>]
    
    head_tag.children
    [<title>The Dormouse's story</title>]
    
    title_tag.parent
    # <head><title>The Dormouse's story</title></head>
    
    sibling_soup.b.next_sibling
    # <c>text2</c>
    
    sibling_soup.c.previous_sibling
    # <b>text1</b>

     find_all == findAll

     find_all(nameattrsrecursivestringlimit**kwargs)

    我的程序:

    from bs4 import BeautifulSoup

    def
    parse_html(text): soup = BeautifulSoup(text, from_encoding="UTF-8") # 找出id="historyTable"的table, 找到它内部的第一个table,获取所有的 tr target = soup.find(id="historyTable").find('table').findAll('tr') results = [] rec = [] for tr in target[1:]: # ignore th tds = tr.findAll('td') # 获取所有的 td build_no = str(tds[1].span.string.strip()) # 找出第二个td的span节点,取出它的text内容 patch = str(tds[0].a.string) # 第一个td 的 a 节点的text status_node = tds[2].find('a') status = str(status_node.find('span').string) status_link = '%s/%s'%(TEAMCITY_HOME, status_node.attrs['href']) # 属性 started = str(tds[5].string.replace(u'xa0', ' ')) # 去掉无法解析的字符 print '-'*10 print '%s '%patch, print '%s '%build_no, print '%s '%status, print '%s '%started
  • 相关阅读:
    phpstrom中Terminal窗口打开
    window安装reidis完成之后,想要把数据存入redis,必须开扩展,不然报错,redis windows phpstudy 安装扩展
    Windows 安装 Anaconda3+PyCharm
    表单序列化+ajax跨域提交
    微信小程序无法获取到unionId(专业踩坑20年)
    支付宝的同步和异步的区别
    layui多图上传
    多图上传控制器及模型代码(2)thinkphp5+layui实现多图上传保存到数据库,可以实现图片自由排序,自由删除。
    【JZOJ4816】【NOIP2016提高A组五校联考4】label
    【JZOJ4815】【NOIP2016提高A组五校联考4】ksum
  • 原文地址:https://www.cnblogs.com/snow-backup/p/5039900.html
Copyright © 2011-2022 走看看