【问题标题】:I can't find an element using BeautifulSoup?我找不到使用 BeautifulSoup 的元素?
【发布时间】:2018-12-14 08:43:28
【问题描述】:

我正在尝试制作一个机器人来抓取此页面http://www.skysports.com/transfer-centre,当我在 Chrome 中打开它时,我可以在开发者工具中看到我想要的元素

但是当我使用下面的代码时,它返回 None:

import requests
from bs4 import BeautifulSoup

page = requests.get('http://www.skysports.com/transfer-centre').text
soup = BeautifulSoup(page, 'lxml')
print(soup.find('time'))

我错过了什么吗?

【问题讨论】:

  • 也许这个元素是通过javascript动态创建的。
  • 如果您打印出pagesoup 并查看它,或者查看源代码而不是查看浏览器中的动态页面,那么<time> 标记在那里吗?如果没有,那么它不在页面上(它是由 JS 创建的,正如 Gabriel 所说),所以你在页面上找不到它。
  • 如果这是问题所在,那么几乎可以肯定有一个很好的重复问题——但简短的版本是您将不得不运行 JS 解释器(例如,PhantomJS)或驱动 Web 浏览器(例如,参见 Selenium),或者阅读 JS 代码并弄清楚它在做什么,这样您就可以在 Python 中做同样的事情,或者跟踪 JS 代码发出的 AJAX 请求,以便您可以在 Python 中发出这些请求。 (最后一个可能不会以与动态网页相同的格式为您提供数据,因此您还需要弄清楚格式是什么,但它可能仍然更容易。)
  • 如果你打算使用无头浏览器,不要使用 phantomjs,它已被弃用。看看this one instead
  • 感谢大家为我指出正确的方向,我最终发现了 @Gabriel 建议的 selenium 和 chrome 驱动程序。

标签: python beautifulsoup


【解决方案1】:

用于从提供的 url 中提取时间, https://data.livefyre.com/bs3/v3.1/bskyb.fyre.co/363166/MTAwMDk1MTI=/init 我从http://www.skysports.com/transfer-centre得到的网址

import requests
import time
import json

page = requests.get('https://data.livefyre.com/bs3/v3.1/bskyb.fyre.co/363166/MTAwMDk1MTI=/init').json()
contents = page['headDocument']['content']
for content in contents:
    c = content['content']
    t = c['updatedAt']
    tt = time.strftime('%H:%M', time.localtime(t))
    authorId = c['authorId']
    bodyHtml = c['bodyHtml']
    print('time : {} , auther: {}'.format(tt, authorId))
    print('------------')
    print('bodyHtml: {}' , json.dumps(bodyHtml, None, 4))
    print('-----------\n\n')

【讨论】:

  • 非常感谢,你得到的链接有我想要的所有数据,请问你是如何提取的?
  • 链接来自加载页面时的网络调用。我认为同样可以通过打开网页使用 python 完成,或者可能使用 selenium 并捕获网络调用(虽然我没有尝试过)。而且您没有从 html 获取时间标签,因为数据来自 api 调用
猜你喜欢
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 2020-10-16
  • 2018-03-03
  • 2015-01-09
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多