首页 > 解决方案 > 问题迭代并将 html 内容保存到 csv

问题描述

进口

from selenium import webdriver
import time
from bs4 import BeautifulSoup
import datetime
from datetime import date
from datetime import datetime

today = date.today()

now = today.strftime("%d.%m.%Y")

from datetime import date
from dateutil.rrule import rrule, DAILY

我想每天检查,所以我用日期制作网址

kurl1 = ('https://www.matterhornparadise.ch/de/Buchen/Online-Tickets/Skipass-Zermatt?from=') 
kurl2 = ('&to=')
kurl3 = ('#ticketCategory')

#three days
a = date(2019, 12, 1)
b = date(2019, 12, 3)

在这里,我创建了一个包含所有 url 的列表,所以我可以通过 selenium 打开它们中的每一个

urllst = []

for dt in rrule(DAILY, dtstart=a, until=b):
    datum = dt.strftime("%Y-%m-%d")
    
    liste = kurl1 +datum +kurl2+datum +kurl3
    
    urllst.append(liste)
    
    

现在我想在一个 html 文件中获取所有三个 html。但它会覆盖。任何人都可以帮忙吗?

for jede in urllst:
    driver.get(jede)
    schreib1 = driver.page_source.encode('utf-8')
    schreib2 = driver.page_source.encode('utf-8')
    schreib3 = driver.page_source.encode('utf-8')


    with open('Daten_zermatt_'+now+'.htm', 'wb+') as file:
        file.write(schreib1+schreib2+schreib3) 
        file.close()

标签: seleniumcsvfor-loop

解决方案


欢迎来到SO。

您的代码中缺少部分 - 因此,我无法准确重现您的代码的行为 - 但我可以在最后一个块中看到一个逻辑谬误:您正在提取相同页面源的三倍(请注意,在for 循环,你driver.get一次,而你提取page_source三次);最后,您将三个相同的 html 文件写在一个文件中。

下面的代码片段提取了两个不同页面的源并将它们存储在一个 html 文件中 - 顺便说一句,这几乎是不可读的:

import requests
from selenium import webdriver

browser = webdriver.Chrome("/usr/lib/chromium-browser/chromedriver")

urllist = ['https://www.google.com', 'https://www.bing.com']

with open('foo.html', 'wb+') as g:
    for url in urllist:
        browser.get(url) # get the i-th url
        schreib = browser.page_source.encode('utf-8') # extract its source
        g.write(schreib) # write it on the html
    g.close()
browser.close()

总结一下:需要在循环打开html文件,然后在循环内一一写入源文件。

最后,我强烈建议您不要将多个 html 页面存储在一个本地文件中:每页只写一个文件,以避免出现问题。


推荐阅读