【问题标题】:python list iteration with boolean带有布尔值的python列表迭代
【发布时间】:2016-07-27 20:26:04
【问题描述】:
class_abbrevs_2 = [x.text for x in subject_page.find_all('td')[1].find_all('a')]

我正在打开每个链接,然后这是给我带来问题的页面。它只有一个'td',它只有一个td:

http://registrar.indiana.edu/browser/soc4168/CTIH/index.shtml 

这是一个普通页面的样子,它有 2 个'td'

http://registrar.indiana.edu/browser/soc4168/CSCI/index.shtml 

谁能告诉我只有在它是真的时我才能运行这条线。我无法弄清楚语法。如果需要的话,只是为了一点背景,我正在使用 python 和 BS4 进行网络抓取。 Lmk 如果有任何其他信息会有所帮助。谢谢

【问题讨论】:

  • "只有当它是真的"
  • 仅当元素 ('td')[1] 为真时,或者换句话说,仅当第二个 ('td') 元素出现在 html 中时
  • 我必须在 lambda 函数中设置它吗?
  • 我认为有些混乱。 ...('td')[1] 不是布尔值,对吧?所以这不是真的或假的。列表中至少有两个元素,或者没有。如果该元素存在,则它是某种 HTML 元素,而不是布尔值。看看我的回答,让我知道这是否符合您的要求。
  • 我想有更好的方法来获得你想要的东西,你能分享一下html吗?

标签: python-3.x web-scraping beautifulsoup boolean


【解决方案1】:

如果我从上面的评论中理解正确,我想你只是想要这个?

tds = subject_page.find_all('td')
if len(tds) > 1:
    class_abbrevs_2 = [x.text for x in tds[1].find_all('a')]

【讨论】:

  • 是的,这行得通,是的,我明白你在说什么。非常感谢。
【解决方案2】:

您可以将代码简化为使用 nth-of-type 来查找第二个 td 的选择:

text = [a.text for a in soup.select("#crsebrowser  td:nth-of-type(2) a")]

如果表中没有第二个 td ,那么它将什么也找不到,因此您最终会得到来自锚点的文本列表,或者什么也没有,因此您不需要任何其他逻辑来获取数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2019-04-27
    • 1970-01-01
    相关资源
    最近更新 更多