beautifulsoup并没有显示所有元素

时间:2017-07-24 12:04:03

标签: python parsing beautifulsoup

我试图解析淘宝网站,并通过BeautifulSoup.find获取有关商品的信息(照片,文字和链接),但它找不到所有课程。

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

1 个答案:

答案 0 :(得分: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列表中的每个项目,通过检查你可以知道如何获得每个例如,对于图片网址的信息,简单的单行将是:

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