python爬虫beautifulsoup_python爬虫初步之BeautifulSoup实战

1.学习beautifulsoup

Step.1 BeautifulSoup是基于标签的,所以我们第一步要准确定位到我们需- 要信息所在的标签。

Step.2 从定位的标签中提取我们需要的信息(一般在属性或者在string中)

Step.3 对于提取数据的简单处理

2.使用beautifulsoup提取丁香园论坛的回复内容

2.1用户浏览器访问目标网站并检查目标内容所在标签

BeautifulSoup是一个可以将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为4种:Tag、NavigableString、BeautifuSoup和Comment。

下面边爬取论坛边介绍每个对象的意义以及方法。

目标网址:

按F12可看见网站结构及回复内容所在标签如下图:

image.png

2.2获取回复内容和用户名

我们所需的评论内容就在td class="postbody"标签下,利用BeautifulSoup获取内容

content = data.find("td", class_="postbody").text

我们需要的用户名在

标签下,利用BeautifulSoup获取内容

name = data.find("div", class_="auth").text

find函数用法:

find(name, attrs, recursive, text, **wargs)    # recursive 递归的,循环的

这些参数相当于过滤器一样可以进行筛选处理。不同的参数过滤可以应用到以下情况:

查找标签,基于name参数

查找文本,基于text参数

基于正则表达式的查找

查找标签的属性,基于attrs参数

基于函数的查找

附源码:

import urllib.request

from bs4 import BeautifulSoup as bs

def main():

headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "

"Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"

}

url = 'http://www.dxy.cn/bbs/thread/626626'

request = urllib.request.Request(url, headers=headers)

response = urllib.request.urlopen(request).read().decode("utf-8")

html = bs(response, 'lxml')

getItem(html)

def getItem(html):

datas = [] # 用来存放获取的用户名和评论

for data in html.find_all("tbody"):

try:

username = data.find("div", class_="auth").get_text(strip=True)

print(username)

content = data.find("td", class_="postbody").get_text(strip=True)

print(content)

datas.append((username,content))

except:

pass

print(datas)

if __name__ == '__main__':

main()

截图:

image.png

3.学习xpath,使用lxml+xpath提取内容

什么是 XPath?

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。

下面列出了最有用的路径表达式:

表达式

描述

nodename

选取此节点的所有子节点

/

从根节点选取

//

从匹配选择的当前节点选择文档中节点,从而不考虑节点的位置

.

选取当前节点

..

选取当前节点的父节点

@

选取属性

Xpath中text(),string(),data()的区别如下:

text()仅仅返回所指元素的文本内容。

string()函数会得到所指元素的所有节点文本内容,这些文本讲会被拼接成一个字符串。

data()大多数时候,data()函数和string()函数通用,而且不建议经常使用data()函数,有数据表明,该函数会影响XPath的性能。

4.使用xpath提取丁香园论坛的回复内容

# _*_ coding:utf-8 _*_

from contextlib import closing

import requests, json, re, os, sys, random, time

from urllib.request import urlopen

import urllib

from lxml import etree

class getUrl(object):

def __init__(self):

self.headers={

"Connection": "keep-alive",

"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",

"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",

"Accept-Encoding": "gzip, deflate",

"Accept-Language": "zh-CN,zh;q=0.9"

};

def run(self):

url = "http://www.dxy.cn/bbs/thread/626626"

req = requests.get(url,headers=self.headers)

html = req.text

tree = etree.HTML(html)

user = tree.xpath('//div[@class="auth"]/a/text()')

content = tree.xpath('//td[@class="postbody"]')

result = []

for i in range(0,len(user)):

#print(content[i])

print(content[i].xpath('string(.)'))

print(user[i].strip()+":"+content[i].xpath('string(.)'))

print('*'*80)

if __name__ == '__main__':

geturl = getUrl()

geturl.run()

截图:

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值