繁体   English   中英

Beautiful Soup find() function 即使元素存在并且 find() 适用于页面上的其他元素,也不返回任何内容?

[英]Beautiful Soup find() function returning none even though element exists and find() works for other elements on the page?

我正在尝试使用 Python 和 BeautifulSoup4 创建一个 web 刮板,以便从 Billboard Hot 100 图表https://www.billboard.com/charts/hot-100/获取数据。

出于某种原因,find()/findAll() 函数无法用于获取 #1 歌曲的艺术家。 但他们努力获得#1 歌曲的标题,以及#2-#100 的所有内容,所以我不确定我做错了什么。

返回无的代码(或使用 findAll 时只是一个空列表):

# GET #1 ARTIST (CURRENTLY NOT WORKING)
topArtist = soup.find("p", {"class": "c-tagline  a-font-primary-l a-font-primary-m@mobile-max lrv-u-color-black u-color-white@mobile-max lrv-u-margin-tb-00 lrv-u-padding-t-025 lrv-u-margin-r-150"})

#1 的艺术家/歌曲的 HTML 标签不同,因此我使用与其他 99 首歌曲不同的单独声明。 但是自从我在#1 获得了这首歌并且我遵循相同的格式我不知道为什么它不起作用。

这是 HTML 标签(我想得到“玻璃动物”):

<p class="c-tagline  a-font-primary-l a-font-primary-m@mobile-max lrv-u-color-black u-color-white@mobile-max lrv-u-margin-tb-00 lrv-u-padding-t-025 lrv-u-margin-r-150">Glass Animals</p>

这是我的 2-100 个职位的工作代码:

from bs4 import BeautifulSoup
import requests    

url = "https://www.billboard.com/charts/hot-100/"
result = requests.get(url)
soup = BeautifulSoup(result.text, "html.parser")

# GET ARTISTS 2-100
artist = soup.findAll("span", {"class": "c-label a-no-trucate a-font-primary-s lrv-u-font-size-14@mobile-max u-line"
                                        "-height-normal@mobile-max u-letter-spacing-0021 lrv-u-display-block a-"
                                        "truncate-ellipsis-2line u-max-width-330 u-max-width-230@tablet-only"
                               })

for i in range(99):
    artist_list.append(artist[i].text)


# GET #1 SONG
topSong = soup.find("a", {"href": "#",
                          "class": "c-title__link lrv-a-unstyle-link"})
song_list.append(topSong.text)

# GET SONGS 2-100
song = soup.findAll("h3", {"class": "c-title a-no-trucate a-font-primary-bold-s u-letter-spacing-0021 lrv-u-font-size"
                                    "-18@tablet lrv-u-font-size-16 u-line-height-125 u-line-height-normal@mobile-max "
                                    "a-truncate-ellipsis u-max-width-330 u-max-width-230@tablet-only",
                           "id": "title-of-a-story"})

for i in range(99):
    song_list.append(song[i].text)

我找遍了,找不到修复方法,使用 selenium webdriver 对我没有任何改变。 任何帮助,将不胜感激。

这是我用来抓取所有 100 首歌曲及其作者的代码。 这个网站真的很难抓取,因为它不以可抓取的方式使用 id 或类,所以我(主要)依赖于页面的当前结构。 我不确定到底是什么导致了您的问题。 该页面是用框架制作的,因此到处都是样式类。 你的选择是变化无常的,因为它依赖于这些是一致的。 也许第一个元素的样式不同(实际上,几乎可以肯定是这种情况,请注意实际页面上的封面图片更大)。

from bs4 import BeautifulSoup
import requests    
x = requests.get("https://www.billboard.com/charts/hot-100/").text
soup = BeautifulSoup(x, "html.parser")
chart = soup.find("div",class_="lxml")
#div.chart-results-list > div.o-chart-results-list-row-container > ul.o-chart-results-list-row"

songNames = [x.text for x in soup.select("div.chart-results-list > div.o-chart-results-list-row-container > ul.o-chart-results-list-row > li:nth-child(4) > ul > li:nth-child(1) h3")]
authorNames = [x.text for x in soup.select("div.chart-results-list > div.o-chart-results-list-row-container > ul.o-chart-results-list-row > li:nth-child(4) > ul > li:nth-child(1) span")]
print(songNames)
#print(authorNames)
print(len(songNames))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM