python爬虫(二)

2.1 Beautiful Soup

Beautiful Soup 是一个可以从HTML和XML文件中提取数据的python库,它可以使用用户喜欢的转换器实现惯用的文档导航,修改,定位等功能。

由于使用的编译环境是python3,安装bs4时,注意使用pip3命令

bs有几种解析器,按照不同的需求选择使用:

python tag类型的find python中tag_html

Tag对象

bs中有几种对象,本次任务主要用到了Tag对象。Tag有两个最重要的属性:name和attribute
name属性

tag.name
tag.name = "blockquot"

attribute属性
一个tag可能有很多个属性. tag <b class="boldest"> 有一个 “class” 的属性,值为 “boldest” . tag的属性的操作方法与字典相同

tag[‘class']
# u'boldest'

也可以用“点”来访问attribute属性

tag.attr
# {u'class': u'boldest'}

修改与删除

tag['class'] = 'verybold'
tag['id'] = 1
tag
# <blockquote class="verybold" id="1">Extremely bold</blockquote>

del tag['class']
del tag['id']
tag
# <blockquote>Extremely bold</blockquote>

tag['class']
# KeyError: 'class'
print(tag.get('class'))
# None

使用bs爬取丁香园社区http://www.dxy.cn/bbs/thread/626626#626626 板块下的信息(用户ID,评论时间,评论内容)

# -*- coding: UTF-8 -*-
from bs4 import BeautifulSoup as bs
import urllib.request
import requests

#url和headers
url = 'http://www.dxy.cn/bbs/thread/626626'
hd = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) '
            'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}

req = urllib.request.Request(url,headers=hd)
response = urllib.request.urlopen(req).read().decode("utf-8")

#打印网页源码
print(requests.get(url,headers = hd).text)

#使用bs获取网页文件,并使用lxml解析器
soup = bs(response,features="lxml")
#打印'a'节点中的链接
for link in soup.find_all('a'):
    print(link.get('href'))

#打印'p'节点的内容
print(soup.p)

#从爬取的源码我们可以发现我们要的ID,时间,评论内容等保存在相应的节点中(<div class="auth">等)
for data in soup.find_all("tbody"):
    try:
        user_id = data.find("div", class_="auth").get_text(strip=True)
        print("user_id: "+user_id)
        time = data.find("div", class_="post-info").get_text(strip=True)
        print("post_time: "+time)
        comment = data.find("td",class_="postbody").get_text(strip=True)
        print("comment: "+comment)
    except:
        pass

爬取结果

python tag类型的find python中tag_html_02

2.2 XPath

Xpath是一门在在XML文件中查找信息的语言,我们也可以用来对html文件进行查找。

Xpath基本语法
路径表达式:

表达式

描述

nodename

选区此节点的所有子节点

/

从根节点选取

//

从当前节点中选取文档中所有节点,无论位置

.

选取当前节点

..

选取当前节点的父节点

@

选取属性

常见带有谓语的路径表达式及其结果:

路径表达式

结果

/bookstore/book[1]

选取属于bookstore元素的第一个book元素

/bookstore/book[last()]

选取属于bookstore元素的最后一个book元素

/bookstore/book[last()-1]

选取属于bookstore元素的倒数第二个book元素

/bookstore/book[position()<3]

选取属于bookstore元素的前两个book元素

//title[@lang]

选取所有拥有lang属性的title元素

//title[@lang='eng']

选取所有lang属性的值为eng的title元素

/bookstore/book[price>35.00]

选取属于bookstore元素的所有book元素,且其price元素大于35.00

/bookstore/book[price>35.00]/title

选取属于bookstore元素的所有price元素大于35.00的book元素中的title元素

Xpath筛选出评论信息代码:

import requests
from lxml import etree

def getHTML(url,hd):
    try:
        r = requests.request("GET",url,headers = hd)
        r.raise_for_status()
        r.encoding = 'utf-8'
        html = r.text
        return html
    except:
        return "Exception!"

def getInfo(html):
    content = etree.HTML(html)
    etree.strip_tags(content, "<br />")
#   user_id = content.xpath('//div[@class="auth"]//text()')
#   post_time = content.xpath('//div[@class="post-info"]/span[1]//text()')
    comment = content.xpath('//td[@class="postbody"]//text()')

    for i in range(len(comment)):
        # print("用户: "+user_id[i].strip())
        # print("时间: "+post_time[i].strip())
        print(comment[i].strip())


if __name__ == "__main__":
    url = "http://www.dxy.cn/bbs/thread/626626"
    hd = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) '
          'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
    html = getHTML(url,hd)
    getInfo(html)

爬取结果

python tag类型的find python中tag_html_03