【问题标题】:Python BeatifulSoup scrape a dynamic containerPython BeautifulSoup 抓取一个动态容器
【发布时间】:2021-10-01 12:52:54
【问题描述】:

我正在尝试从this 网站上抓取一些抽认卡,但我遇到了一些问题。在我的代码的 sn-p 下面:

# point to the right link and chapter
url_main = r'https://learninglink.oup.com/access/content/neuroscience-sixth-edition-student-resources/neuroscience-6e-chapter-1-flashcards?previousFilter=tag_chapter-'
chapter = '01'
url_main = url_main + chapter

# get source
html = requests.get(url_main).text
bs = BeautifulSoup(html, features="html.parser")

如果我在 Chrome 上检查页面,我可以看到我要查找的信息在 class="box1text" 中。所以我这样做:

# get class
text = bs.find(class_ = "box1text" )

但是,当我打印这个“文本”变量时,我得到:

<span aria-live="assertive" class="box1text"></span>

并且没有提及我要查找的文本。我做错了什么?

另外,我想知道如何与这个容器及其按钮进行交互,但我什至不知道从哪里开始。我的理想输出将是一个包含所有关键字和相关答案的字典(因此,每个抽认卡的正面和背面),但要做到这一点,我需要能够与这个容器进行交互。有关如何执行此操作的任何建议?

提前致谢!

【问题讨论】:

  • 现代页面使用 JavaScript 添加元素,但 BeautifulSoup 无法运行 JavaScript,您可能需要 Selenium 来控制可以运行 JavaScript 的真实网络浏览器 - 但这工作(非常)慢 - 但是代码可以像普通人一样交互。或者您应该使用@hidden_​​machine 描述的方法 - 它可能比正常抓取更快。

标签: python html web-scraping beautifulsoup


【解决方案1】:

我知道这不能回答你的问题,但实际上有更好的方法来解决这个问题。

如果您进入浏览器的 devTools 侧边栏,并检查网络日志, 你会看到有一个 Http 请求被发送来获取所有的抽认卡信息:

如您所见,您需要做的就是通过复制请求标头并发送它来模仿这个 http 请求。 由于我不使用 python,我只会在 windows 命令提示符下使用 cUrl。 您现在也可以通过right clicking 执行此操作

编辑: 此外,您帖子中的网站不需要在请求中发送任何其他参数,因此您应该能够逃脱:

curl "https://learninglink.oup.com/protected/files/content/flashcardCsv/1512079199667-Neuroscience6e-ch01_flashcards.csv"

你可以复制粘贴到cmd中自己验证

【讨论】:

  • 我很确定您可以通过几乎任何语言发送 http 请求,因为有库(内置或外部)可以这样做。我不知道 python,所以我不知道在 python 中执行此操作的正常方法,但是由于您只需编写一个 http 请求即可获取所有抽认卡信息,因此不应该花太长时间弄清楚如何去做。
  • 我只添加到这个答案:在页面 curl.trillworks.com 您可以将 curl 转换为 Python 和其他语言。有时当 curl 需要很多选项时它可能会创建不正确的代码,但这应该不是问题。
  • 正如您所说,它没有回答原始问题,但它是一个很棒且更简单的解决方案,因此 +1 并被接受。谢谢!
  • 补充一点,copy as curl(cmd) 在 Windows 的错误位置提供了许多烦人的 '^'。您必须对其进行编辑才能使 curl 命令与 cmd 一起正常工作
猜你喜欢
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 2015-07-18
  • 2019-06-28
相关资源
最近更新 更多