[英]Scraping a list of words split into multiple webpages with Python
我想制作一個程序,可以計算哪些單詞或哪些單詞會讓玩家在拼字游戲中獲得最高分。 但是,為此,我需要一個被接受的單詞列表。 我找到了英語的 sowpods 列表,但我想讓這個程序也能用法語工作,這是我的母語。
我發現這個網站提供了這樣一個列表,但它被分成 918 個網頁,這會使復制粘貼所有內容變得相當長......
我曾嘗試使用 Python 庫(我不記得是哪一個)來進行 web 抓取以獲取單詞,但由於我真的不知道如何使用它,它似乎很難。 我得到了網站的全部文本,然后我可以逐個字符到 go 到 select 只是單詞列表,但是由於每個頁面上的字符數會有所不同,所以這不能很容易地自動化。
我考慮過使用正則表達式來 select 僅大寫字母的單詞(因為它們在網站上)但是如果還有其他大寫字母的單詞或字符,例如網站上的標題,那么我的單詞列表將不正確.
我怎樣才能得到所有的單詞而不必更改我的每一頁的代碼?
看起來該網站在頁面之間具有一致的結構。 這些單詞存儲在一個span
標簽中,其中一個名為mot
的 class 。 您提到的庫可能是 BeautifulSoup,這使得自動化非常容易。 您只需要請求每個頁面,select 標簽mot
並提取 innerHtml。 用空格字符 ( " "
) 拆分內容將為您提供一個數組,其中包含您需要從該頁面中獲取的所有單詞。
讓我知道這是否對您有幫助,以及您在編碼部分是否需要更多幫助。
編輯:我在下面包含了一些代碼。
import requests
from bs4 import BeautifulSoup
def getWordsFromPage(pageNumber):
if pageNumber == 1:
# page 1
url = 'https://www.listesdemots.net/touslesmots.htm'
else:
# from page 2 to 918
url = 'https://www.listesdemots.net/touslesmotspage{pageNumber}.htm'
url = url.format(pageNumber=pageNumber)
response = requests.get(url)
html_soup = BeautifulSoup(response.text, 'html.parser')
span = html_soup.find("span", "mot")
words = span.text.split(" ")
return words
print("Page 1")
print(getWordsFromPage(1))
print("Page 24")
print(getWordsFromPage(24))
print("Page 918")
print(getWordsFromPage(918))
所有頁面都是相同的,並且單詞在 span 標簽中。 使用requests和beautifulsoup很容易:
import time
import requests
from bs4 import BeautifulSoup
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 YaBrowser/19.10.3.281 Yowser/2.5 Safari/537.36'
}
pages = ['https://www.listesdemots.net/touslesmots.htm'] # adds the first page
for p in range(2, 919): # adding the remaining pages
pages.append('https://www.listesdemots.net/touslesmotspage%s.htm' % p)
for p in pages:
data = None
try:
# download each page
r = requests.get(p, headers=headers)
data = r.text
except:
# we dont handle errors
print("Failed to download page: %s" % p)
if data:
# instanciate the html parser and search for span.mot
soup = BeautifulSoup(data, 'html.parser')
wordTag = soup.find("span", {"class": "mot"})
words = 0
if wordTag:
# if there is a span.mot tag found, split its contents by one blanc
words = wordTag.contents[0].split(' ')
print ('%s got %s words' % (p, len(words)))
time.sleep(5)
Output:
https://www.listesdemots.net/touslesmots.htm got 468 words
https://www.listesdemots.net/touslesmotspage2.htm got 496 words
https://www.listesdemots.net/touslesmotspage3.htm got 484 words
https://www.listesdemots.net/touslesmotspage4.htm got 468 words
....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.