Очистка HTML с помощью BeautifulSoup

#python #web-scraping #beautifulsoup

#python #очистка веб-страниц #beautifulsoup

Вопрос:

Я хотел бы выполнить очистку на следующем веб-сайте, хранилище обращений:https://engagements.ceres.org/?_ga=2.157917299.852607976.1552678391-697747477.1552678391

Функции, которые предполагается извлечь, являются:

‘Организация’, «Отрасль», «Заголовок», «Filed_By», ‘Статус, год’, ‘Сводка’ (основной текст)

Мой вопрос в том, как мне выполнить очистку в каждом конкретном случае и выполнить цикл программы по всем страницам?

URL в моем коде — это только первый случай, но мне нужно просмотреть все страницы в репозитории (88 страниц) и записать их в CSV

Мне интересно, сработает ли использование lambda в этом случае

Также может кто-нибудь любезно рассказать о том, как понимать и идентифицировать шаблоны в html-тегах для будущего использования, потому что я новичок в этой области.

Следующий код — это то, что у меня есть на данный момент:

 url = "https://engagements.ceres.org/ceres_engagementdetailpage?recID=a0l1H00000CDy78QAD"

page = requests.get(url, verify=False)

soup = BeautifulSoup(page.text, 'html.parser')
  

Комментарии:

1. На странице, доступной по предоставленной ссылке, отображаются только «категория» и «отрасль». Не могли бы вы пояснить?

2. Пользовательский интерфейс @Ajax1234 там не очень удобен для пользователя. если вы просто используете ctrl f и выполните поиск по запросу OP, вы найдете там все желаемые цвета

Ответ №1:

Я думаю, вам нужно объединить bs с selenium, поскольку некоторый контент загружается немного медленнее. Вы можете использовать bs для захвата начальных ссылок, а затем использовать selenium и waits для обеспечения загрузки содержимого на каждой странице. Сначала вам нужно решить проблему с сертификатом.

Я не уверен, что такое сводка, поэтому я предоставляю все теги p. Это означает некоторую дублированную информацию. Вы можете усовершенствовать это.

 import requests
from bs4 import BeautifulSoup as bs
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd

baseUrl = 'https://engagements.ceres.org'
results = []
driver = webdriver.Chrome()

r = requests.get('https://engagements.ceres.org/?_ga=2.157917299.852607976.1552678391-697747477.1552678391', verify=False)
soup = bs(r.content, 'lxml')
items =  [baseUrl   item['href'] for item in soup.select("[href*='ceres_engagementdetailpage?recID=']")]

for item in items:
    driver.get(item)
    WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "p")))
    title = driver.find_element_by_css_selector('.resolutionsTitle').text
    organisation = driver.find_element_by_css_selector('#description p').text
    year = driver.find_element_by_css_selector('#description p   p').text
    aList = driver.find_elements_by_css_selector('.td2')
    industry = aList[0].text
    filedBy = aList[2].text
    status = aList[5].text
    summary = [item.text for item in driver.find_elements_by_css_selector('#description p')]
    results.append([organization, industry, title, filedBy, status, year, summary])
df = pd.DataFrame(results, headers = ['Organization', 'Industry', 'Title', 'Filed By', 'Status', 'Year', 'Summary'])
print(results)
  

Комментарии:

1. спасибо за ваш комментарий. В настоящее время я не знаком с selenium, но я изучу его

2. ОК. дайте мне знать, как это происходит. Существует множество ссылок, поэтому вы можете попробовать использовать фрагмент списка для элемента в items[:10]: first

3. спасибо за ваше предложение, оно отлично работает. ценю!