使用BeautifulSoup进行HTML Scraping

问题描述 投票:-4回答:1

我想在以下网站上进行抓取,这是一个案例库: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')
python web-scraping beautifulsoup
1个回答
0
投票

我认为你需要将bs与selenium结合起来,因为一些内容的加载速度要慢一些。您可以使用bs来获取初始链接,然后使用selenium并等待以确保加载每个页面上的内容。您最初需要处理证书问题。

我不确定摘要是什么,所以我提供了所有的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)
© www.soinside.com 2019 - 2024. All rights reserved.