【问题标题】:Scraping data with multiple same class name using BeautifulSoup使用 BeautifulSoup 抓取具有多个相同类名的数据
【发布时间】:2020-03-03 21:38:43
【问题描述】:

我正在使用房地产网站练习抓取,我想抓取所有地址以获取最近的销售。例如,网站 HTML 的部分如下所示: 网址=https://www.compass.com/agents/irene-vuong/

<div class="profile-active-listings" role="tabpanel" id="active-listings-sales">
    <div class="card-content">
      <a class="card-title" href="/listing" data-tn="label-address"> 111 East 35th </a>
                                            ........
<div class="textIntent-headline1"> Recent Sales</div>
    <div class="card-content">
      <a class="card-title" href="/morelisting" data-tn="label-address"> East 4th </a>

我正在尝试使用以下代码访问所有地址:

for i in range(0, 30):
    h = soup.findAll('a', {'class':'card-title'})[i]
    print(h)

但是,我收到以下错误:

IndexError: list index out of range

我得到了前几个地址,但只是在“最近的销售”之前。 它只获取第一部分的地址,而不是整个网站。 如何获取所有地址?

【问题讨论】:

  • 您能分享您要抓取的实际页面吗?
  • @ZacharyBlackwood 我刚刚添加了!
  • 您似乎使用了错误的class。该页面上当前有 12 个项目,其类别为 uc-listingCart-title,而不是 card-title。如果您按照@user2263572 的建议遍历这些内容(而不是对30 进行硬编码),那应该会为您提供您正在寻找的所有项目。
  • @ZacharyBlackwood 嗨,我尝试了这个建议,但它仍然只得到了一部分,而不是全部...... :-(
  • 啊。看起来额外的项目正在前端动态添加。这个答案可能有助于在 javascript 添加项目后获取页面内容。 stackoverflow.com/a/26440563/5031672

标签: python web-scraping beautifulsoup


【解决方案1】:

findAll 方法返回与您的搜索条件匹配的所有元素的列表。

在您的情况下,它返回一个长度为 2 的列表。

然后您将遍历 0-29 并在您的 length2 列表中查找这些索引。

因此你的错误。

您的代码应该更像:

for x in soup.findAll('a', {'class':'card-title'}):
  print(x)

【讨论】:

  • 以上回复回答了您的原始问题。这回答了您当前的问题。 stackoverflow.com/questions/16322862/…
  • 您好,我不确定这篇文章与我的问题有何关联……我在代码中使用了“html.parser”。你能解释一下吗?将不胜感激。
  • 您的问题“使用 BeautifulSoup 抓取具有多个相同类名的数据”,而您的问题是“findall 没有找到它应该找到的所有东西”。我链接了“美丽的汤findAll没有找到所有”这个问题。我认为这是相关的。该链接解释了您的问题,或者您没有使用正确的 css 选择器。
  • 不幸的是,我认为这篇文章没有帮助:-(我认为我的问题与帖子中的问题不同。
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2015-04-02
相关资源
最近更新 更多