Python:BeautifulSoup将HTML段落标记中的单词添加到列表中

时间:2020-02-26 02:29:54

标签: python beautifulsoup

我一直在努力尝试使用BeautifulSoup学习网络抓取。我正在尝试制作一个Hangman游戏来学习Python,并想制作一个单人游戏模式,该模式使用英语中排名前1000的最常用单词。我原本只是要复制粘贴每个单词并遍历一个列表(这就是为什么有while循环的原因),但我决定尝试使用BeautifulSoup。

import requests
from bs4 import BeautifulSoup

#words = []
#while True:
    #word = input("Enter the word: ")
    #words.append(word)
    #print(words)

page = requests.get("https://www.ef.edu/english-resources/english-vocabulary/top-1000-words/") 
resources/english-vocabulary/top-1000-words/")
soup = BeautifulSoup(page.content, "html.parser")
para = soup.find(class_="field-item even")

我不确定从这儿去哪里。我试图将来自网站的所有这些项(甚至位于feild-item类的第二个段落标记中)附加到一个列表中,然后将该列表另存为程序包,以供主要的Hangman游戏使用。由于单词出现在第二段标签中,因此我不确定如何执行此操作。我观看了一些YouTube视频,但它们都处理了具有ID或要调用的其他类的文本。谢谢

2 个答案:

答案 0 :(得分:0)

单词排在第二个<p>中,因此请使用para.find_all("p")[1]来获取它。

然后您可以从该标签中获得.text-它的所有单词都在一个字符串中。

字符串具有应删除的标签-.replace("\t", ""),然后您可以.split("\n")创建带有单词的列表。

import requests
from bs4 import BeautifulSoup

page = requests.get("https://www.ef.edu/english-resources/english-vocabulary/top-1000-words/") 

soup = BeautifulSoup(page.content, "html.parser")
para = soup.find(class_="field-item even")

second_p = para.find_all('p')[1]
text = second_p.text.replace('\t', '')
words = text.split('\n')
print(words)

答案 1 :(得分:0)

我为您写了一个快速的解决方案。您只需要找到正确的div,然后选择包含单词的正确子标记即可。由于格式问题,需要将单词去除空白并放在列表中。 Furas' answer更详细地描述了该过程。

import requests
from bs4 import BeautifulSoup

class Hangman:

    def run_game(self):
        word_bank = self.get_word_bank()
        while True:
            # Your game here

    def get_word_bank(self):
        page = requests.get("https://www.ef.edu/english-resources/english-vocabulary/top-1000-words/", verify=False)
        soup = BeautifulSoup(page.content, "html.parser")
        words_tag = soup.find('div', {'class': "field-item even"})
        word_bank = words.split(", ".join(words_tag.findChildren()[1].getText().split()))
        return word_bank

if __name__ == "__main__":
    hangman = Hangman()
    hangman.run_game()