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
總結
以上是生活随笔為你收集整理的python爬虫beautifulsoup_python爬虫初步之BeautifulSoup实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美股科技板块去年全线下挫:空头大幅回血
- 下一篇: win10安装ipython_windo