Веб-очистка Python на нескольких страницах

#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)