【问题标题】:Python - How to scrape a class one by onePython - 如何一个一个地抓取一个类
【发布时间】:2018-12-16 10:34:24
【问题描述】:

所以我一直在尝试一个一个地抓取一个值,这意味着我使用一个 for 循环来抓取一个选定的类,然后尝试逐项打印出来。 HTML 正在寻找:

我试图做的是以下代码:

select_tags = bs4.find_all('select', {'autocomplete': 'off'})
    test = []
    for select_tag in select_tags:

        if select_tag.select("option.disabled.ReminderRevealButton"):
            continue
        else:
            print(select_tag)
            test.append(select_tag.text)

我得到的输出是:

['\nPlease select number\n\n                            (Number 1)                        \n\n                            (Number 2)                        \n\n                            (Number 3)                        \n\n                            (Number 4)                        \n\n                            (Number 5)                        \n\n                            (Number 6)                        \n\n                            (Number 7)                        \n\n                            (Number 7)                        \n\n                            (Number 8)                        \n\n                            (Number 9)                        \n\n                            (Number 10)                        \n\n                            (Number 11)                        \n']}

这确实会打印出名称。然而问题是它以一行的形式打印出来,而不是(HTML代码中的数字)一一打印出来。

我需要做什么才能解决问题,以便它一一打印数字 1,2,3,4,5..?

【问题讨论】:

  • 你真的想要select > option:not(.disabled.ReminderRevealButton)
  • 糟糕!那是一个我也没有注意到的错误!谢谢@hjpotter92 - 但是如果我可能会问,你建议我改变什么?

标签: python beautifulsoup


【解决方案1】:

因为你循环的是select标签而不是option标签,所以它会打印一个。 BeautifulSoup 不支持:not

select_tags = bs4.find_all('select', {'autocomplete': 'off'})
test = []

for select_tag in select_tags:
    for option in select_tag.select('option'):
    # if set(['ReminderRevealButton', 'disabled']) == set(option.get('class')):
    if "disabled ReminderRevealButton" in str(option):
        # print(str)
        # <option class="disabled ReminderRevealButton"> (Number 1) </option>
        continue
    else:
        print(option.get('class'))
        test.append(option.text.strip())

我没有使用option['class']option.get('class'),因为它返回类的数组,如果类的长度相同,您可以使用set() 进行比较,否则需要循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 2014-04-19
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2020-11-27
    • 2017-09-01
    相关资源
    最近更新 更多