使用requests_html爬取Apple Music播放列表时移除特定span元素
问题:移除Apple Music爬取结果中的特定span元素
我是Python新手,想要实现爬取Apple Music播放列表信息的功能,代码如下:
import datetime from requests_html import HTMLSession session = HTMLSession() url = 'https://music.apple.com/us/playlist/top-100-hong-kong/pl.7f35cffa10b54b91aab128ccc547f6ef' applemusic = session.get(url) applemusic.html.render(sleep=1, scrolldown=1) data = applemusic.html.xpath('//*[@id="scrollable-page"]/main/div/div[2]', first=True) artist_list = data.find('span.svelte-vyyb4r') for artist in artist_list: print(artist)
但输出结果中包含一个带songs-list-row__badge类的span元素:
<Element 'span' class=('svelte-vyyb4r',)> <Element 'span' class=('svelte-vyyb4r',)> <Element 'span' class=('songs-list-row__badge', 'songs-list-row__badge--explicit', 'svelte-vyyb4r')> <Element 'span' class=('svelte-vyyb4r',)> <Element 'span' class=('svelte-vyyb4r',)>
我尝试使用remove()函数移除该元素,但报错:
for artist in artist_list.remove("songs-list-row__badge"): print(artist)
输出:
ValueError: list.remove(x): x not in list
请问该如何移除这个特定元素?
解决方案
方法1:筛选时直接排除目标元素(推荐)
不用先获取所有元素再过滤,直接用CSS选择器排除带songs-list-row__badge类的span,修改find的参数即可:
# 替换原代码中的artist_list行 artist_list = data.find('span.svelte-vyyb4r:not(.songs-list-row__badge)')
:not()是CSS伪类,会直接过滤掉带有指定类的元素,一步到位。
方法2:对已获取的列表进行过滤
如果已经拿到了artist_list,可以用列表推导式筛选掉包含目标类的元素:
# 在获取artist_list之后添加这行代码 artist_list = [elem for elem in artist_list if 'songs-list-row__badge' not in elem.classes]
这里通过检查每个元素的classes属性(包含所有类名的元组),排除掉带有目标类的元素。
方法3:正确使用remove()删除单个元素
你之前报错是因为remove()需要传入列表里存在的元素对象,而不是字符串类名。如果确定只有一个这样的元素,可以这样做:
# 先定位目标元素 target_elem = None for elem in artist_list: if 'songs-list-row__badge' in elem.classes: target_elem = elem break # 找到后移除 if target_elem: artist_list.remove(target_elem)
这种方法适合精准删除单个特定元素的场景,若存在多个同类元素,更推荐用方法2处理。
内容的提问来源于stack exchange,提问作者stevenfung
相关产品推荐
相关产品推荐

