【问题标题】:BeautifulSoup: extracting attribute for various itemsBeautifulSoup:提取各种项目的属性
【发布时间】:2017-03-02 23:23:48
【问题描述】:

假设我们有这样的 HTML(抱歉,我不知道如何复制和粘贴页面信息,而且这是在 Intranet 上):

我想获得所有问题的突出显示部分(这就像 Stack Overflow 页面)。 编辑:更清楚地说,我感兴趣的是获得一个列表:

['question-summary-39968',
 'question-summary-40219',
 'question-summary-42899',
 'question-summary-34348',
 'question-summary-32497',
 'question-summary-35308',
...]

现在我知道一个可行的解决方案是我可以做的列表理解:

[item["id"] for item in html_df.find_all(class_="question-summary")]

但这并不是我想要的。第一项如何直接访问question-summary-41823

另外,soup.selectsoup.get 有什么区别?

【问题讨论】:

  • 在目前的形式中,不清楚您要选择什么。 soup.select()CSS 选择器完美配合。所有.question-summaryid => soup.select(".question-summary[id]")
  • 这个列表理解怎么不是你想要的?结果是否需要以不同的方式排序?
  • 不,列表理解为我提供了一个适合我的目的的列表。我只是想更好地理解 BeautifulSoup 以及如何直接访问像 question-summary-41823 这样的东西。这不可能吗?
  • 不确定还有什么比这更直接的吗?你得到元素并得到它的属性。 html_df.find(class_="question-summary")["id"] 如果你只想要第一个。
  • 是的,但这只会给我第一个。如果我想要所有这些怎么办?我是否必须做一些类似于我的列表理解的事情?

标签: python css beautifulsoup


【解决方案1】:

如果对他人有帮助,我想我会在这里发布我的答案。

我想做的是访问question-summary 类中的id 属性。

现在你可以做这样的事情并且只为第一个项目(对象?)获取它:

html_df.find(class_="question-summary")["id"]

但你想要他们所有人。所以你可以这样做来获取类数据:

html_df.select('.question-summary')

但你不能只做

html_df.select('.question-summary')["id"]

因为您有一个包含bs4.elements 的列表。因此,您需要遍历列表并仅选择您想要的部分。你可以做一个for 循环,但更优雅的方法是使用列表理解:

[item["id"] for item in html_df.find_all(class_="question-summary")]

分解它的作用,它:

  • 它首先从汤中创建一个包含所有question-summary 对象的列表
  • 遍历列表中的每个元素,我们将其命名为item
  • 提取id 属性并将其添加到列表中

您也可以使用select:

[item["id"] for item in html_df.find_all(class_="question-summary")]

我更喜欢第一个版本,因为它更明确,但任何一个都会导致:

['question-summary-43960',
 'question-summary-43953',
 'question-summary-43959',
 'question-summary-43947',
 'question-summary-43952',
 'question-summary-43945',
...]

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多