我正在尝试使用 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
工作正常
为什么这个方法不起作用?我应该怎么做才能获得有关good的所有信息?我正在使用 python 2.7
最佳答案
所以,看起来你想要解析的项目是由 JavaScript 动态构建的,这就是 soup.text.find("J_TItems")
的原因。返回-1
,即文本中根本没有“J_TItems”。你可以做的是使用 selenium
带有 JS 解释器,对于 headless 浏览,您可以使用 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'
关于python - beautifulsoup 未显示所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45280179/