首页 > 解决方案 > 如何使用带有多个 URL(输入)的 Selenium、Bs4 和 Docx 使用 Python 进行 WebScrape 到多个输出 Docx 文件中?

问题描述

对于如何使用 Selenium、BS4 和 Docx 抓取多个 URL,我一直在搞乱一些不同的解决方案,到目前为止,我已经能够抓取 1 个 URL 以准确提取我想要的内容,并且还能够将输出导出到单个 docx文件。只是当涉及到多个或 1+ 个 URL 时,我遇到了麻烦。

目前,我在下面有这段代码正在抓取内容。

我想创建一个循环来抓取,开始,只是 2 个网页或多个 url,并确定它何时可以循环遍历那些我可以将列表附加到我拥有的其他 URL 的列表。

我想将每个 url 内容/输出导出到每个单独的 docx 文件。

下面是代码:

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
from selenium.webdriver import ActionChains
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import requests
import time
import docx
import os

doc = docx.Document()


url =["https://www.udemy.com/course/python-the-complete-python-developer-course/",
     "https://www.udemy.com/course/the-creative-html5-css3-course-build-awesome-websites/"]

#output = [1,2]

list1 = url
for item in url:
    try:
        PATH = "C:\Program Files (x86)\chromedriver.exe"

        driver = webdriver.Chrome(PATH)

        driver.get(item)
    except:
        # if the link cant be scraped
        break

    time.sleep(5)

    button = driver.find_element_by_xpath("//div/div[@class='curriculum--sub-header--23ncD']/button[@class='udlite-btn udlite-btn-medium udlite-btn-ghost udlite-heading-sm']")

    button.click()

    time.sleep(5)

    html = driver.page_source

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

    main = soup.find_all('div',{'class' : 'section--panel--1tqxC panel--panel--3NYBX'})

    for mains in main:
        header = mains.find_all("span",{'class' : 'section--section-title--8blTh'})
        for title in header:
            outputtitle = title.text
            doc.add_heading(outputtitle,1)
            for titles in header:
                sub = mains.find_all('div',{'class' : 'section--row--3PNBT'})
                for a in sub:
                    sub1 = a.find_all("span")
                    for sub in sub1:
                        outputsub = sub.text
                        doc.add_heading(outputsub,3)
    for i in range(len(list1)):
        doc.save("file%s.docx" %i)

标签: pythonseleniumbeautifulsoupdocx

解决方案


创建一个存储链接的列表

links = []

用 try except 语句遍历它们

for item in links:
    try:
        # open item
    except:
        # if the link cant be scraped
        break

    # scrape the link

    with open(f'{item.replace(".", "").replace("/", "")}', 'w') as file:
        file.write(scraped_info)

推荐阅读