Очистка ссылок внутри ссылок, уже очищенных с помощью Python - PullRequest
3 голосов
/ 09 июля 2019

Я перебираю в Интернете множество PDF-файлов заседаний комитетов на веб-сайте местного правительства. (https://www.gmcameetings.co.uk/) Следовательно, есть ссылки .. внутри ссылок ... внутри ссылок. Я могу успешно вычистить все теги 'a' из главной области страницы (те, которые мне нужны), но когда я пытаюсь и поцарапать что-либо внутри них я получаю ошибку в заголовке вопроса: AttributeError: Объект ResultSet не имеет атрибута 'find'. Вы, вероятно, рассматриваете список предметов как отдельный предмет. Вы вызывали find_all (), когда хотели вызвать find ()? Как мне это исправить?

Я совершенно новичок в кодировании и вчера начал стажировку, для которой я, как ожидается, отсканирую эту информацию. Женщина, с которой я должен работать, не будет здесь еще пару дней, и никто другой не сможет мне помочь, поэтому, пожалуйста, потерпите меня и будьте добры, так как я начинающий и делаю это один. Я знаю, что правильно настроил первую часть кода, так как могу загрузить всю страницу целиком или скачать любые конкретные ссылки. Опять же, когда я пытаюсь просмотреть ссылки, которые я уже (и успешно удалил), я получаю сообщение об ошибке выше. Я думаю (с небольшим знанием, которое я знаю), что это из-за 'вывода' 'all_links', который выходит как ниже. Я пробовал оба find () и findAll (), которые оба приводят к одному и тому же сообщению об ошибке.

 #the error message
 date_links_area = all_links.find('ul',{"class":"item-list item-list-- 
 rich"})
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "C:\Users\rache\AppData\Local\Programs\Python\Python37-32\lib\site- 
 packages\bs4\element.py", line 1620, in __getattr__
 "ResultSet object has no attribute '%s'. You're probably treating a list 
 of items like a single item. Did you call find_all() when you meant to 
 call 
 find()?" % key
 AttributeError: ResultSet object has no attribute 'find'. You're probably 
 treating a list of items like a single item. Did you call find_all() when 
 you meant to call find()?

#output of all_links looks like this (this is only part of it)

HREF = "https://www.gmcameetings.co.uk/info/20180/live_meetings/199/membership_201819">Members GMCA 2018/19, Большой Манчестерская Комбинированная Власть Конституция, документы собрания,

Некоторые из этих ссылок затем переходят на страницу со списком дат - в ту область страницы, к которой я пытаюсь добраться. Затем в этой области мне нужно получить ссылки с датами. Затем внутри них мне нужно взять PDF-файлы, которые я хочу. Извиняюсь, если это не имеет смысла. Я изо всех сил стараюсь сделать это самостоятельно с нулевым опытом.

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Это решение использует рекурсию для непрерывной очистки ссылок на каждой странице, пока не будут обнаружены URL-адреса PDF:

from bs4 import BeautifulSoup as soup
import requests
def scrape(url):
  try:
    for i in soup(requests.get(url).text, 'html.parser').find('main', {'id':'content'}).find_all('a'):
      if '/downloads/meeting/' in i['href'] or '/downloads/file/' in i['href']:
         yield i
      elif i['href'].startswith('https://www.gmcameetings.co.uk'):
         yield from scrape(i['href'])
  except:
      pass

urls = list(scrape('https://www.gmcameetings.co.uk/'))
0 голосов
/ 09 июля 2019

Ошибка на самом деле говорит вам, в чем проблема.all_links - это список (объект ResultSet) найденных вами элементов HTML.Вам нужно перебрать список и вызвать find для каждого:

sub_links = [all_links.find('ul',{"class":"item-list item-list-- 
 rich"}) for link in all_links]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...