【问题标题】:I'm trying to scrape a website for some list items, but beautiful soup does not find any on the page我正在尝试为一些列表项抓取网站,但在页面上找不到漂亮的汤
【发布时间】:2019-04-21 07:41:46
【问题描述】:

我正在尝试制作一张表格,在其中收集来自this page 的每个作曲家的所有作品,并通过添加“分数”来排列它们,例如第 300 名得 1 分,第 10 名得 290 分等。使用 Python 脚本。

但是,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

【问题讨论】:

  • 您是否尝试过打印response.text 以查看实际得到的结果?

标签: python html web-scraping beautifulsoup


【解决方案1】:

我没有看到 300-1 的所有排名。有时页面只显示到 148,有时到 146,我见过的最低是 143。不知道这是否是设计缺陷/错误。该页面已更新 javascript,这就是您获得空列表的原因。该内容尚未呈现。

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

您通常可以使用开发工具 F12 来检查页面用于通过网络选项卡更新内容的网络流量。打开网络选项卡,刷新整个页面,然后在 XHR 上进行过滤。

在这种情况下,信息实际上是从已经保存了该信息的脚本标签中提取的。您可以打开元素选项卡 (Chrome) 并执行 Ctrl+F 并搜索作曲家的姓名。您会发现一个匹配项出现在脚本标记中。我使用正则表达式通过匹配 javascript var songs = []; 来查找其中的脚本标记,然后在下面的正则表达式组中包含包含作曲家信息的对象。

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

你可以从脚本标签中获取这些

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]))

无论哪种方式,您都可以使用标题的 len 来生成一个反向的数字列表,从而给出排名:

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

【讨论】:

  • 这个名单还没有完全公布,快过复活节了,不过我会试试的,谢谢!
  • 它似乎工作,但我真的不明白这是什么意思/有什么区别是它是 javascript 更新?我是编码新手,我猜我只是不太确定脚本的作用。我了解 re 模块,但我不太精通 beautifulsoup,以及您如何知道要搜索的脚本/数据。
  • 另外,在 pycharm 中运行它会出现错误“没有明确声明解析器,使用 html.parser”
  • 请回答这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 2021-01-05
  • 1970-01-01
  • 2021-10-07
  • 2022-01-08
  • 2021-11-12
  • 2021-11-27
相关资源
最近更新 更多