我一直在努力尝试使用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或要调用的其他类的文本。谢谢
答案 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()