【问题标题】:How do I web scrape the names of the production companies from IMDB website我如何从 IMDB 网站上抓取制作公司的名称
【发布时间】:2021-10-10 04:23:48
【问题描述】:

我需要抓取一些电影的制片公司的名称。我不断尝试使用锚标记a 和包含名称的类,但它不会返回生产公司。

网址:https://www.imdb.com/title/tt0473553/?ref_=fn_al_tt_1

这是我要抓取的网站的 HTML 部分:

<section class="ipc-page-section ipc-page-section--base">
  <div data-testid="title-details-section" class="styles__MetaDataContainer-sc-12uhu9s-0 cgqHBf">
    <ul>
      <li role="presentation" class="ipc-metadata-list__item ipc-metadata-list-item--link" data-testid="title-details-companies"><a class="ipc-metadata-list-item__label ipc-metadata-list-item__label--link" rel="" href="/title/tt0473553/companycredits?ref_=tt_dt_co" target="">Production companies</a>
        <div class="ipc-metadata-list-item__content-container">
          <ul class="ipc-inline-list ipc-inline-list--show-dividers ipc-inline-list--inline ipc-metadata-list-item__list-content base" role="presentation">
            <li role="presentation" class="ipc-inline-list__item">
                <a class="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" rel="" href="/company/co0136980?ref_=tt_dt_co_1">IDT Entertainment</a>
            </li>
            <li role="presentation" class="ipc-inline-list__item">
                <a class="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" rel="" href="/company/co0142161?ref_=tt_dt_co_2">New Arc Entertainment</a>
            </li>
          </ul>
        </div>
      </li>
    </ul>
  </div>
</section>

这是我尝试过的:

import requests
from bs4 import BeautifulSoup

movie_url="https://www.imdb.com/title/tt0473553/?ref_=fn_al_tt_1"
movie_page = requests.get(movie_url)
soup = BeautifulSoup(page.text, 'html.parser')

#movies_comp = soup.find_all("li", class_="ipc-inline-list__item")
movies_comp = soup.find_all("a", class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link")

print(movies_comp)

我没有得到理想的输出。我期望它返回的输出是这样的:

['IDT Entertainment', 'New Arc Entertainment']

【问题讨论】:

  • @deceze 我已经编辑了这个问题。这够了吗?我正在尝试回答。
  • @Xitiz 这里需要一个被解析的 HTML 样本,它不能是外部链接,因为不能保证我们甚至看到与 OP 看到的相同的 HTML。跨度>
  • @deceze 那么,我相信只有我自己编辑是不够的,对吧?
  • @Xitiz 你能把问题改写成一个不依赖于外部网站的最小可重现示例吗?或者至少提供该网站的样例?从理论上讲,您只需要提供一个小的 HTML 字符串并删除 requests 的东西...
  • @Xitiz 问题也适用于未来的访问者,如果它依赖于外部网站甚至 理解 问题,那么 1) 这些网站将来可能会并且很可能会改变并过时问题,并且 2) 将迫使访问者访问这些外部网站并检查它们,甚至了解问题和解决方案是否适用于他们。网络抓取问题在这里也不例外。是的,有了这个给定的样本,现在可以重新提出问题了。

标签: python web-scraping imdb


【解决方案1】:

您可以尝试以下方法:

import requests

from bs4 import BeautifulSoup

page=requests.get("https://www.imdb.com/title/tt0473553/?ref_=fn_al_tt_1")

page="""
<section class="ipc-page-section ipc-page-section--base">
  <div data-testid="title-details-section" class="styles__MetaDataContainer-sc-12uhu9s-0 cgqHBf">
    <ul>
      <li role="presentation" class="ipc-metadata-list__item ipc-metadata-list-item--link" data-testid="title-details-companies"><a class="ipc-metadata-list-item__label ipc-metadata-list-item__label--link" rel="" href="/title/tt0473553/companycredits?ref_=tt_dt_co" target="">Production companies</a>
        <div class="ipc-metadata-list-item__content-container">
          <ul class="ipc-inline-list ipc-inline-list--show-dividers ipc-inline-list--inline ipc-metadata-list-item__list-content base" role="presentation">
            <li role="presentation" class="ipc-inline-list__item">
                <a class="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" rel="" href="/company/co0136980?ref_=tt_dt_co_1">IDT Entertainment</a>
            </li>
            <li role="presentation" class="ipc-inline-list__item">
                <a class="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" rel="" href="/company/co0142161?ref_=tt_dt_co_2">New Arc Entertainment</a>
            </li>
          </ul>
        </div>
      </li>
    </ul>
  </div>
</section>
"""

soup=BeautifulSoup(page,"lxml")

# To understand this is then structur of the data you want to extract :
# <li role="presentation" class="ipc-metadata-list__item ipc-metadata-list-item--link" data-testid="title-details-companies">
    # <ul class="ipc-inline-list ipc-inline-list--show-dividers ipc-inline-list--inline ipc-metadata-list-item__list-content base" role="presentation"><li role="presentation" class="ipc-inline-list__item"><a class="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" rel="" href="/company/co0136980?ref_=tt_dt_co_1">
        # <a class="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" rel="" href="/company/co0136980?ref_=tt_dt_co_1">IDT Entertainment</a>
        # <a class="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" rel="" href="/company/co0142161?ref_=tt_dt_co_2">New Arc Entertainment</a>

print([a.text for a in soup.find("li",attrs={'class':r'ipc-metadata-list__item ipc-metadata-list-item--link','data-testid':r'title-details-companies'})
                                .find("ul",class_="ipc-inline-list ipc-inline-list--show-dividers ipc-inline-list--inline ipc-metadata-list-item__list-content base")
                                    .find_all("a")])

输出:

['IDT Entertainment', 'New Arc Entertainment']

&lt;a&gt;class 所以,你得到了多个。

【讨论】:

  • 感谢您的解决方案,但这仅适用于一部电影。我想对电影列表做同样的事情。这将为每部电影返回相同的输出。
  • 删除那个页面变量!
  • 好吧,让我试试
猜你喜欢
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多