爬上海證券網(wǎng)的大標(biāo)題和top-topic猫妙。使用的是beautifulsoup。
過(guò)程中遇到的問(wèn)題
網(wǎng)頁(yè)結(jié)構(gòu)不難仰税,我希望能得到網(wǎng)頁(yè)中所有的大標(biāo)題--》就是<h1/>標(biāo)簽中的標(biāo)題和top-toptic中所有的標(biāo)題构资。
1.beautifulsoup中findAll函數(shù)不支持交集的查找。
findAll函數(shù)中的參數(shù)只支持并集的查找陨簇,比如:
print(bsObj.findAll("div","h1","a"))
會(huì)把所有div吐绵,h1,a標(biāo)簽的內(nèi)容全部提取出來(lái)河绽,而不是div中h1己单,h1中a的標(biāo)簽的內(nèi)容。如果需要這樣查找耙饰,也可以用children函數(shù)來(lái)實(shí)現(xiàn)纹笼。但是用位置定位你需要的內(nèi)容太麻煩了。
所以我的解決辦法是苟跪,分別查找然后去重廷痘。然后就遇到第二個(gè)問(wèn)題
2.如何對(duì)中文進(jìn)行比較
在beautifulsoup里中文編碼是Unicode。但是python中比較字符串是否一致的函數(shù)件已。在上證網(wǎng)中top-list含在一個(gè)class屬性值為top-area 的div里面笋额,當(dāng)我對(duì)這個(gè)div進(jìn)行提取文字,是提取了這個(gè)段落里面的所有的文字篷扩。這些文字是被當(dāng)做連續(xù)的內(nèi)容整體處理的兄猩。也就是說(shuō)里面的文字的內(nèi)容可能是來(lái)自<h1/>標(biāo)題,也可能是來(lái)自<h2/>標(biāo)題等鉴未。所以可以用找子串的函數(shù)來(lái)處理枢冤。如果查找<h1/>標(biāo)題在<div/>標(biāo)簽里面出現(xiàn),就刪除歼狼。
index = Obj_toplist.get_text().find(obj_h1.get_text())
刪除函數(shù)是
Objs_h1.remove(remove_list)
3.去除重復(fù)的標(biāo)簽
對(duì)于list可以用remove去除list中第一個(gè)匹配成功的元素掏导。但是remove會(huì)讓list的長(zhǎng)度減1.所以如果有倆個(gè)連續(xù)的位置需要去除。不能識(shí)別一個(gè)去除一個(gè)羽峰。這樣會(huì)漏掉倆個(gè)連續(xù)位置的中的第二個(gè)元素。做法是對(duì)于遇到的重復(fù)的標(biāo)簽添瓷,先儲(chǔ)存梅屉,然后一次性全部去除。
for remove_list in removes_list:
Objs_h1.remove(remove_list)
以下是源代碼
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
html = urlopen("http://www.cnstock.com")
bsObj = BeautifulSoup(html,"html.parser")
Objs_h1 = bsObj.findAll("h1")
Objs_toplist = bsObj.findAll("div",{"class":"top-area"})
removes_list = []
#去除重復(fù)的文字【重要新聞處理】
for Obj_toplist in Objs_toplist:
for obj_h1 in Objs_h1:
index = Obj_toplist.get_text().find(obj_h1.get_text())
if index !=-1 :
removes_list.append(obj_h1)
for remove_list in removes_list:
Objs_h1.remove(remove_list)
print("重要新聞")
for Obj_h1 in Objs_h1:
print(Obj_h1.get_text())
for Obj_toplist in Objs_toplist:
print(Obj_toplist.get_text())