python爬虫beautifulsoup_python爬虫初步之BeautifulSoup实战
1.學(xué)習(xí)beautifulsoup
Step.1 BeautifulSoup是基于標(biāo)簽的,所以我們第一步要準(zhǔn)確定位到我們需- 要信息所在的標(biāo)簽。
Step.2 從定位的標(biāo)簽中提取我們需要的信息(一般在屬性或者在string中)
Step.3 對于提取數(shù)據(jù)的簡單處理
2.使用beautifulsoup提取丁香園論壇的回復(fù)內(nèi)容
2.1用戶瀏覽器訪問目標(biāo)網(wǎng)站并檢查目標(biāo)內(nèi)容所在標(biāo)簽
BeautifulSoup是一個可以將復(fù)雜的HTML文檔轉(zhuǎn)換成一個復(fù)雜的樹形結(jié)構(gòu),每個節(jié)點都是python對象,所有對象可以歸納為4種:Tag、NavigableString、BeautifuSoup和Comment。
下面邊爬取論壇邊介紹每個對象的意義以及方法。
目標(biāo)網(wǎng)址:
按F12可看見網(wǎng)站結(jié)構(gòu)及回復(fù)內(nèi)容所在標(biāo)簽如下圖:
image.png
2.2獲取回復(fù)內(nèi)容和用戶名
我們所需的評論內(nèi)容就在td class="postbody"標(biāo)簽下,利用BeautifulSoup獲取內(nèi)容
content = data.find("td", class_="postbody").text
我們需要的用戶名在
標(biāo)簽下,利用BeautifulSoup獲取內(nèi)容name = data.find("div", class_="auth").text
find函數(shù)用法:
find(name, attrs, recursive, text, **wargs) # recursive 遞歸的,循環(huán)的
這些參數(shù)相當(dāng)于過濾器一樣可以進(jìn)行篩選處理。不同的參數(shù)過濾可以應(yīng)用到以下情況:
查找標(biāo)簽,基于name參數(shù)
查找文本,基于text參數(shù)
基于正則表達(dá)式的查找
查找標(biāo)簽的屬性,基于attrs參數(shù)
基于函數(shù)的查找
附源碼:
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.學(xué)習(xí)xpath,使用lxml+xpath提取內(nèi)容
什么是 XPath?
XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言。
在 XPath 中,有七種類型的節(jié)點:元素、屬性、文本、命名空間、處理指令、注釋以及文檔(根)節(jié)點。XML 文檔是被作為節(jié)點樹來對待的。
下面列出了最有用的路徑表達(dá)式:
表達(dá)式
描述
nodename
選取此節(jié)點的所有子節(jié)點
/
從根節(jié)點選取
//
從匹配選擇的當(dāng)前節(jié)點選擇文檔中節(jié)點,從而不考慮節(jié)點的位置
.
選取當(dāng)前節(jié)點
..
選取當(dāng)前節(jié)點的父節(jié)點
@
選取屬性
Xpath中text(),string(),data()的區(qū)別如下:
text()僅僅返回所指元素的文本內(nèi)容。
string()函數(shù)會得到所指元素的所有節(jié)點文本內(nèi)容,這些文本講會被拼接成一個字符串。
data()大多數(shù)時候,data()函數(shù)和string()函數(shù)通用,而且不建議經(jīng)常使用data()函數(shù),有數(shù)據(jù)表明,該函數(shù)會影響XPath的性能。
4.使用xpath提取丁香園論壇的回復(fù)內(nèi)容
# _*_ 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
總結(jié)
以上是生活随笔為你收集整理的python爬虫beautifulsoup_python爬虫初步之BeautifulSoup实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美股科技板块去年全线下挫:空头大幅回血
- 下一篇: win10安装ipython_windo