python - beautifulsoup 未显示所有元素

标签 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

工作正常

为什么这个方法不起作用?我应该怎么做才能获得有关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/

相关文章:

parsing - 是否有解析器生成器能够生成可以解析此: S → 'x' S 'x' | 'x' 的解析器

python - 使用 BeautifulSoup4 解析 HTML 表格

python - 立即获取标签后的文本

python - BeautifulSoup HTML 表格解析

python - tensorflow:在多个检查点上运行模型评估

python - 根据 df 中其他两列的比较设置列值

python - python中读取的csv格式错误

python - 使用 BeautifulSoup4 和 Python 3 解析 html 表

python - python的idle里面有水平滚动条吗?

python - 在 Canopy 上使用 Python 进行网页抓取