【问题标题】:Cant find specific class component using BeautifulSoup使用 BeautifulSoup 找不到特定的类组件
【发布时间】:2019-04-13 03:59:02
【问题描述】:

我正在尝试为电影网站制作一个刮板,以收集电影名称列表。 我尝试使用 BeautifulSoup 来解析 HTML 文件,我看到每部电影都在一个名为 "movie-row" 的类中。但是在这个类上使用select 方法并没有检索到站点的相应数据。我能得到的最接近的 HTML 组件是 .quickbook-section 的父类。

为什么有些 HTML 标签在 BS 中可用,而有些则不可用?

这是我编写的代码。

def get_movies_names():
    url = "https://www.yesplanet.co.il/#/buy-tickets-by-cinema?in-cinema=1025&at=2018-11-09&view-mode=list"
    raw_html = util.simple_get(url)
    bs = BeautifulSoup(raw_html, 'html.parser')
    bs.select(".movie-row")

(simple_get只是一个返回HTML响应内容的函数)

【问题讨论】:

  • BS 无法处理 JavaScript,您可能会遇到这个问题,其中某些网站是通过 JavaScript 加载的

标签: python web-scraping beautifulsoup


【解决方案1】:

似乎特定网站正在使用 JavaScript 呈现其电影数据。

Beautiful soup 不是浏览器,因此它没有 DOM,因此无法运行 JavaScript 代码。它所做的只是获取页面内容并解析它。如果您查看相关页面的源代码并查看源代码(在大多数浏览器中右键单击“查看源代码”)并搜索.movie-row,您会发现没有匹配项。

在这种情况下,您必须找到一种替代方法来抓取数据,尝试调查它使用的 JavaScript 代码的作用,然后从那里着手。或者,您可能想看看使用 Selenium 和 PhantomJS。

【讨论】:

    【解决方案2】:

    正如一些人所指出的,它是通过 javascript 加载的,而 BS4 并不能真正使用它。当您看到通过 javascript 加载的数据时,您可以打赌某处存在 API 调用。与其尝试抓取数据,不如查看它是否在调用 JSON 对象,以及是否可以在没有任何 apikey 的情况下访问 JSON 对象。

    如果您需要一些不同的东西,您可能需要调整一些 URL 模式。

    import requests, json
    # Ignore the insecure warning
    from requests.packages.urllib3.exceptions import InsecureRequestWarning
    requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
    
    url = "https://www.yesplanet.co.il/il/data-api-service/v1/poster/10100/by-showing-type/SHOWING?lang=he_IL&ordering=desc"
    
    # Get the page
    response = requests.get(url, verify=False)
    
    # Load into json
    j = json.loads(response.text)
    
    # process what you want
    for poster in j['body']['posters']:
        print(poster['url'], poster['featureTitle'])
    

    脚本的输出如下:

    /films/bohemian-rhapsody רפסודיה בוהמית
    /films/the-other-story סיפור אחר
    /films/the-girl-in-the-spiders-web הנערה ברשת העכביש
    /films/the-nutcracker-and-the-four-realms מפצח האגוזים  וארבע הממלכות
    /films/911 11 בספטמבר
    /films/virgins אין בתולות בקריות
    

    每张海报的可用属性为 attributescodedateStartedfeatureTitlemediaListposterSrcurlweight

    如果您想知道我是如何发现该 URL 的,我使用了 chrome 开发者控制台并重新加载了该页面。过滤 XHR (XMLHttpRequest),你会看到有数据的 URL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-14
      • 2011-02-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多