#python #web-scraping #beautifulsoup #python-requests
#python #очистка веб-страниц #beautifulsoup #python-запросы
Вопрос:
Я очищаю все слова с веб-сайта Merriam-Webster.
Я хочу очистить все страницы, начиная с a-z, и все страницы внутри них и сохранить их в текстовый файл. Проблема, с которой я сталкиваюсь, заключается в том, что я получаю только первый результат таблицы вместо всех. Я знаю, что это большой объем текста (около 500 КБ), но я делаю это для самообразования.
код:
import requests
from bs4 import BeautifulSoup as bs
URL = 'https://www.merriam-webster.com/browse/dictionary/a/'
page = 1
# for page in range(1, 75):
req = requests.get(URL str(page))
soup = bs(req.text, 'html.parser')
containers = soup.find('div', attrs={'class', 'entries'})
table = containers.find_all('ul')
for entries in table:
links = entries.find_all('a')
name = links[0].text
print(name)
Теперь я хочу получить все записи из этой таблицы, но вместо этого я получаю только первую запись.
Я как бы застрял здесь, поэтому буду признателен за любую помощь. Спасибо
https://www.merriam-webster.com/browse/medical/a-z
https://www.merriam-webster.com/browse/legal/a-z
https://www.merriam-webster.com/browse/dictionary/a-z
https://www.merriam-webster.com/browse/thesaurus/a-z
Комментарии:
1. Как и в приведенном ниже ответе, вам нужен еще один цикл for . Один из них предназначен для зацикливания от а до Я, внутренний цикл for для зацикливания номеров страниц. Чтобы получить номер страницы, найдите тег a для последней страницы, тогда вы получите номер последней страницы:
<a aria-label="Last" data-page="75" ...
Ответ №1:
Чтобы получить все записи, вы можете использовать этот пример:
import requests
from bs4 import BeautifulSoup
url = 'https://www.merriam-webster.com/browse/dictionary/a/'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
for a in soup.select('.entries a'):
print('{:<30} {}'.format(a.text, 'https://www.merriam-webster.com' a['href']))
С принтами:
(a) heaven on earth https://www.merriam-webster.com/dictionary/(a%29 heaven on earth
(a) method in/to one's madness https://www.merriam-webster.com/dictionary/(a) method in/to one's madness
(a) penny for your thoughts https://www.merriam-webster.com/dictionary/(a) penny for your thoughts
(a) quarter after https://www.merriam-webster.com/dictionary/(a) quarter after
(a) quarter of https://www.merriam-webster.com/dictionary/(a) quarter of
(a) quarter past https://www.merriam-webster.com/dictionary/(a) quarter past
(a) quarter to https://www.merriam-webster.com/dictionary/(a) quarter to
(all) by one's lonesome https://www.merriam-webster.com/dictionary/(all%29 by one's lonesome
(all) choked up https://www.merriam-webster.com/dictionary/(all%29 choked up
(all) for the best https://www.merriam-webster.com/dictionary/(all%29%20for the best
(all) in good time https://www.merriam-webster.com/dictionary/(all%29%20in good time
...and so on.
Для очистки нескольких страниц:
url = 'https://www.merriam-webster.com/browse/dictionary/a/{}'
for page in range(1, 76):
soup = BeautifulSoup(requests.get(url.format(page)).content, 'html.parser')
for a in soup.select('.entries a'):
print('{:<30} {}'.format(a.text, 'https://www.merriam-webster.com' a['href']))
РЕДАКТИРОВАТЬ: чтобы получить все страницы от А до Я:
import requests
from bs4 import BeautifulSoup
url = 'https://www.merriam-webster.com/browse/dictionary/{}/{}'
for char in range(ord('a'), ord('z') 1):
page = 1
while True:
soup = BeautifulSoup(requests.get(url.format(chr(char), page)).content, 'html.parser')
for a in soup.select('.entries a'):
print('{:<30} {}'.format(a.text, 'https://www.merriam-webster.com' a['href']))
last_page = soup.select_one('[aria-label="Last"]')['data-page']
if last_page == '':
break
page = 1
РЕДАКТИРОВАНИЕ 2: для сохранения в файл:
import requests
from bs4 import BeautifulSoup
url = 'https://www.merriam-webster.com/browse/dictionary/{}/{}'
with open('data.txt', 'w') as f_out:
for char in range(ord('a'), ord('z') 1):
page = 1
while True:
soup = BeautifulSoup(requests.get(url.format(chr(char), page)).content, 'html.parser')
for a in soup.select('.entries a'):
print('{:<30} {}'.format(a.text, 'https://www.merriam-webster.com' a['href']))
print('{}t{}'.format(a.text, 'https://www.merriam-webster.com' a['href']), file=f_out)
last_page = soup.select_one('[aria-label="Last"]')['data-page']
if last_page == '':
break
page = 1
Комментарии:
1. Это только для страницы «a», но я хочу, чтобы это было для всех страниц «a-z». Пожалуйста, можете ли вы рассказать мне об этом
2. Спасибо, но, как новичок, я не понимаю некоторые команды, поэтому, если вы можете добавить некоторые пояснения, которые помогут и другим. И я также хочу сохранить это в текстовый файл, как это сделать.
3. @Mujtaba Смотрите мое редактирование 2, как сохранить в файл.
4. Спасибо, сэр, это действительно полезно. Наконец, я добавляю и другие категории, но получаю некоторые ошибки. Не могли бы вы добавить это также в код. Они следующие: тезаурус , медицинский , юридический .
5. Пожалуйста, посмотрите выше, когда у вас будет время.
Ответ №2:
Я думаю, вам нужен еще один цикл:
for entries in table:
links = entries.find_all('a')
for name in links:
print(name.text)