我试图解析淘宝网站,并通过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
答案 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'