我试图在网站上搜索一些列表项,但是在pag上找不到任何美丽的汤

2024-06-11 04:39:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图制作一个表格,在那里我从this page收集每个作曲家的所有作品,并使用Python脚本添加“score”来排列它们,例如第300名得1分,第10名得290分,等等。你知道吗

然而,BeautifulSoup似乎没有找到li元素。我做错什么了?网页HTML的截图:https://gyazo.com/73ff53fb332755300d9b7450011a7130

我已经尝试过使用soup.lisoup.findAll("li")soup.find_all("li"),但都返回“none”或类似的结果。打印soup.body会返回正文,所以我想我确实有一个HTML文档。你知道吗

from bs4 import BeautifulSoup as bsoup
import requests

link = "https://halloffame.classicfm.com/2019/"
response = requests.get(link)
soup = bsoup(response.text, "html.parser")
print(soup.li)

我希望它至少能给我一个li项,但是它返回None。你知道吗


Tags: httpsimportcomresponsehtmlpagelinkli
1条回答
网友
1楼 · 发布于 2024-06-11 04:39:31

我没有看到所有的排名都在300-1之间。有时页面显示只有148页,其他时间显示146页,最低的是143页。不知道这是否是设计缺陷/缺陷。页面是javascript更新的,这就是为什么你会得到一个空列表。该内容尚未呈现。你知道吗

requests只返回不依赖javascript呈现的内容,即使用浏览器时无法获得所看到的所有内容,如果启用了javascript,浏览器将允许在运行页面上的各种脚本时加载其他内容。这是现代响应式/动态网页的一项功能,例如,在页面上进行选择时,您不再需要更新整个页面。你知道吗

通常,您可以使用dev toolsF12检查页面用于通过“网络”选项卡更新内容的web流量。打开“网络”选项卡,刷新整个页面,然后在XHR上进行筛选。你知道吗

在本例中,该信息实际上是从已经保存该信息的脚本标记中提取的。您可以打开“元素”选项卡(Chrome)并执行Ctrl+F搜索作曲家的姓名。您将发现一个匹配出现在脚本标记中。我使用regex通过匹配javascript var songs = [];找到这个脚本标记,然后在下面的regex组中找到包含编写器信息的对象。你知道吗

来自目标脚本标记的示例:

enter image description here

你可以从脚本标签抓取这些

import requests
from bs4 import BeautifulSoup as bs
import re

soup = bs(requests.get('https://halloffame.classicfm.com/2019/', 'lxml').content, 'lxml')
r = re.compile(r'var songs = \[\];(.*)' , re.DOTALL)
data = soup.find('script', text=r).text
script = r.findall(data)[0].strip()
rp = re.compile(r'position:\s+(\d+)')
rankings = rp.findall(script)     
rt = re.compile(r'title:\s+"(.*)"')
titles = rt.findall(script) 

print(len(titles))
print(len(rankings)) 

如果你能找到这些排名的其余部分,你可以压缩你的名单,同时扭转排名列表

results = list(zip(titles, rankings[::-1]))

无论哪种方式,您都可以使用标题的长度来生成一个数字列表,该列表将给出排名:

rankings = list(range(len(titles), 0, -1))
results = list(zip(titles, rankings[::-1]))

相关问题 更多 >