2017-07-24 60 views
1

我試圖解析淘寶網站,並與BeautifulSoup.find獲取貨物(照片,文本和鏈接)的信息,但它沒有找到所有的類。beautifulsoup不顯示所有ellements

url='https://xuanniwen.world.tmall.com/category-1268767539.htm?search=y&catName=%BC%D0%BF%CB#bd&view_op=citations_histogram' 

def get_html(url): 
    r = requests.get(url) 
    return r.text 

html=get_html(url) 
soup=BeautifulSoup(html, 'lxml') 
z=soup.find("div",{"class":"J_TItems"}) 

z-爲空。 但是,例如:

z=soup.find("div",{"class":"skin-box-bd"}) 
len(z) 
Out[196]: 3 

工作正常

爲什麼這種方法行不通?我應該怎麼做才能獲得有關良好的所有信息?我使用的Python 2.7

+0

嘗試'soup.text.find(「J_TItems」)'你會發現它會說'湯'中根本沒有'J_TItems',我認爲發生的事情是你想解析的內容不是在html中,實際上是由JavaScript動態構建的,您應該查看Python的selenium模塊。 –

回答

2

因此,它看起來像你想解析正在由JavaScript動態構建的項目,這就是爲什麼soup.text.find("J_TItems")回報-1,即存在於文本中的所有沒有「J_TItems」 。你可以做的是使用selenium用JS解釋,對於一個無頭的瀏覽,你可以使用PhantomJS這樣的:

from bs4 import BeautifulSoup 
from selenium import webdriver 

url='https://xuanniwen.world.tmall.com/category-1268767539.htm?search=y&catName=%BC%D0%BF%CB#bd&view_op=citations_histogram' 

browser = webdriver.PhantomJS() 
browser.get(url) 
html = browser.page_source 

soup = BeautifulSoup(html, 'html5lib') # I'd also recommend using html5lib 
JTitems = soup.find("div", attrs={"class":"J_TItems"}) 

注意你想要的物品是由<div class="item4line1">定義每一行裏面,有其中5人(你也許只想前三,因爲其他兩個是不是真正的主搜索,過濾不應該是困難裏面,一個簡單的rows = rows[2:]做的伎倆):

rows = JTitems.findAll("div", attrs={"class":"item4line1"}) 
>>> len(rows) 
5 

現在不冰每一個「好」,你提的問題是一個<dl class="item">裏面,所以你需要讓他們都在for循環:

Goods = []  
for row in rows: 
    for item in row.findAll("dl", attrs={"class":"item"}): 
     Goods.append(item) 

所有有剩下來要做的就是讓「照片,文本和鏈接」爲你所提到的,這樣就可以輕鬆地完成訪問每個項目在Goods列表中,通過檢查可以知道如何讓每一個信息,爲例子,對於圖片的URL一個簡單的行會:

>>> Goods[0].find("dt", class_='photo').a.img["src"] 
'//img.alicdn.com/bao/uploaded/i3/TB19Fl1SpXXXXbsaXXXXXXXXXXX_!!0-item_pic.jpg_180x180.jpg' 
+0

非常感謝您的幫助。也許你可以告訴我,我怎麼能理解哪些方法用於一些隱藏的內容JavaScript,Ajax等,而我試着解析網站。 – egorkh

+0

@egorkh我很樂意提供幫助!我想說的是'selenium'並且加載JavaScript永遠是最好的選擇,但是你可以通過檢查你想要抓取的頁面的html源代碼來判斷你是否需要它,如果你想要的不是這樣但是它在檢查代碼窗口中,您需要JavaScript解析! –