当所有标题都在一个类中并且所有段落都在其他类中时,报废网站后如何将标题和段落一起写?

问题描述 投票:0回答:1

我正在尝试使用硒抓取此链接 -“https://library.municode.com/az/avondale/codes/code_of_ordinances?nodeId=CD_ORD_CH1GEPR” 用于练习。但我无法在我的文档中编写与其标题相关的段落。 循环不起作用,因为它会写入一个标题和页面上的所有段落,然后写入另一个标题,然后再次写入所有段落。

我试过这个。

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
import time
from bs4 import BeautifulSoup
import requests

website= "https://library.municode.com/az/avondale/codes/code_of_ordinances?nodeId=CD_ORD_CH1GEPR"

#setting up driver
driver_path="path\chromedriver\chromedriver-win64\chromedriver.exe"
Service = webdriver.ChromeService(executable_path = driver_path)
driver=webdriver.Chrome(service=Service)

document_path="path\\documents"

#Running website
while True:    
    driver.get(website)
    driver.maximize_window()
    time.sleep(10)

    #Each title-paragraph chunk
    chunks=driver.find_elements(By.CLASS_NAME,"chunks")
    for chunk in chunks:
        titles=chunk.find_elements(By.XPATH,'.//div[@class="chunk-title"]')
        paras=chunk.find_elements(By.XPATH,'.//p')
    for title in titles:
        print(title.text+"\n")
        for para in paras:
            print(para.text+"\n")
    '''
    #writing in document
    with open(f"{document_path}\\document.txt",'w') as document:
        for title in titles:
            document.writelines(title.text+' '+"\n")
            for para in paras:
                document.write(para.text+' '+"\n")
'''
    #closing
    close=input()
    if close=="x":
        driver.quit()
        break

我想要这个:-

标题1

第 1 段

第 1.2 段

标题2

第2段

但是我得到了这个:-

标题1

第 1 段

第 1.2 段

第2段

标题2

第 1 段

第 1.2 段

第2段

html 是这样的-

<div class="chunk-title">Article I - GENERAL PROVISIONS</div>

适用于所有标题。

<div class="chunk-content">
    <p class="p0">
           The ordinances embraced in the following chapters and sections shall constitute and
           be designated "Avondale City Code, Revised, 1984" and may be so cited. Such code may
           also be cited as the "Avondale City Code." (Code 1971, Art. 1-1)
    </p>
</div>

适用于所有段落。

这里可以使用多线程吗?

python selenium-webdriver web-scraping
1个回答
0
投票

一些建议...

  1. 从 Selenium 4.6 开始,您不再需要设置和配置驱动程序。他们添加了 SeleniumManager,它负责自动下载、配置和使用适当的驱动程序。我删除了您所有不必要的代码。

  2. 如果您想要做的只是转储页面上的整个文本,那么迭代所有子元素并打印每个子元素就没有任何意义。只需抓取包含您想要的内容的最高级别元素并转储

    element.text
    。完成。

  3. 这里不需要线程。

考虑到这一点,这是工作代码......

from selenium import webdriver
from selenium.webdriver.common.by import By

website = "https://library.municode.com/az/avondale/codes/code_of_ordinances?nodeId=CD_ORD_CH1GEPR"

#setting up driver
driver = webdriver.Chrome()

#running website
driver.get(website)
driver.maximize_window()

#print text
chunks = driver.find_element(By.CSS_SELECTOR,"ul.chunks")
print(chunks.text)
© www.soinside.com 2019 - 2024. All rights reserved.