Готовый фрагмент для настройки часовых поясов и формата преобразования. См. Правильный ответ ниже для получения подробной информации, приводящей к этому решению.
tzvar = int(input("Enter the number of hours you'd like to add to the timestamp:"))
tzvarsecs = (tzvar*3600)
print (tzvarsecs)
def timestamp_to_str(timestamp):
return datetime.fromtimestamp(timestamp).strftime('%H:%M:%S %m/%d/%Y')
timestamps = soup('span', {'class': '_timestamp js-short-timestamp '})
dtinfo = [timestamp["data-time"] for timestamp in timestamps]
times = map(int, dtinfo)
adjtimes = [x+tzvarsecs for x in times]
adjtimesfloat = [float(i) for i in adjtimes]
dtinfofloat = [float(i) for i in dtinfo]
finishedtimes = [x for x in map(timestamp_to_str, adjtimesfloat)]
originaltimes = [x for x in map(timestamp_to_str, dtinfofloat)]
КОНЕЦ ВТОРОЙ EDIT
EDIT:
Этот код позволяет мне скрести время POSIX из HTML-файла, а затем добавить определенное количество часов, введенных пользователем в оригинале стоимость. Отрицательные числа также будут работать, чтобы вычесть часы. Пользователь будет работать целыми часами, поскольку изменения предназначены специально для настройки часовых поясов.
tzvar = int(input("Enter the number of hours you'd like to add to the timestamp:"))
tzvarsecs = (tzvar*3600)
print (tzvarsecs)
timestamps = soup('span', {'class': '_timestamp js-short-timestamp '})
dtinfo = [timestamp["data-time"] for timestamp in timestamps]
times = map(int, dtinfo)
adjtimes = [x+tzvarsecs for x in times]
Все, что осталось, является обратной функцией, подобной предложенной ниже. Как преобразовать каждое время POSIX в список в читаемый формат с помощью функции?
END EDIT
Приведенный ниже код создает файл CSV, содержащий данные соскабливают с сохраненным Twitter HTML-файл.
Twitter преобразует все временные метки в локальное время пользователя в браузере. Я хотел бы иметь возможность ввода для пользователя, чтобы настроить отметки времени на определенное количество часов, чтобы данные для твита отображали местное время твитера.
В настоящее время я очищаю элемент под названием 'title'
, который является частью каждой постоянной ссылки. Я мог бы так же легко очистить время POSIX от каждого твита.
title="2:29 PM - 28 Sep 2015"
против
data-time="1443475777" data-time-ms="1443475777000"
Как отредактировать следующий фрагмент поэтому добавил переменную, вводимую пользователем для каждой метки времени? Мне не нужна помощь с запросом ввода, мне просто нужно знать, как применить его к списку временных меток после того, как вход передан на python.
timestamps = soup('a', {'class': 'tweet-timestamp js-permalink js-nav js-tooltip'})
datetime = [timestamp["title"] for timestamp in timestamps]
Другие вопросы, связанные с этим кодом/проекта.
Fix encoding error with loop in BeautifulSoup4?
Focusing in on specific results while scraping Twitter with Python and Beautiful Soup 4?
Using Python to Scrape Nested Divs and Spans in Twitter?
Полный код.
from bs4 import BeautifulSoup
import requests
import sys
import csv
import re
from datetime import datetime
from pytz import timezone
url = input("Enter the name of the file to be scraped:")
with open(url, encoding="utf-8") as infile:
soup = BeautifulSoup(infile, "html.parser")
#url = 'https://twitter.com/search?q=%23bangkokbombing%20since%3A2015-08-10%20until%3A2015-09-30&src=typd&lang=en'
#headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'}
#r = requests.get(url, headers=headers)
#data = r.text.encode('utf-8')
#soup = BeautifulSoup(data, "html.parser")
names = soup('strong', {'class': 'fullname js-action-profile-name show-popup-with-id'})
usernames = [name.contents for name in names]
handles = soup('span', {'class': 'username js-action-profile-name'})
userhandles = [handle.contents[1].contents[0] for handle in handles]
athandles = [('@')+abhandle for abhandle in userhandles]
links = soup('a', {'class': 'tweet-timestamp js-permalink js-nav js-tooltip'})
urls = [link["href"] for link in links]
fullurls = [permalink for permalink in urls]
timestamps = soup('a', {'class': 'tweet-timestamp js-permalink js-nav js-tooltip'})
datetime = [timestamp["title"] for timestamp in timestamps]
messagetexts = soup('p', {'class': 'TweetTextSize js-tweet-text tweet-text'})
messages = [messagetext for messagetext in messagetexts]
retweets = soup('button', {'class': 'ProfileTweet-actionButtonUndo js-actionButton js-actionRetweet'})
retweetcounts = [retweet.contents[3].contents[1].contents[1].string for retweet in retweets]
favorites = soup('button', {'class': 'ProfileTweet-actionButtonUndo u-linkClean js-actionButton js-actionFavorite'})
favcounts = [favorite.contents[3].contents[1].contents[1].string for favorite in favorites]
images = soup('div', {'class': 'content'})
imagelinks = [src.contents[5].img if len(src.contents) > 5 else "No image" for src in images]
#print (usernames, "\n", "\n", athandles, "\n", "\n", fullurls, "\n", "\n", datetime, "\n", "\n",retweetcounts, "\n", "\n", favcounts, "\n", "\n", messages, "\n", "\n", imagelinks)
rows = zip(usernames,athandles,fullurls,datetime,retweetcounts,favcounts,messages,imagelinks)
rownew = list(rows)
#print (rownew)
newfile = input("Enter a filename for the table:") + ".csv"
with open(newfile, 'w', encoding='utf-8') as f:
writer = csv.writer(f, delimiter=",")
writer.writerow(['Usernames', 'Handles', 'Urls', 'Timestamp', 'Retweets', 'Favorites', 'Message', 'Image Link'])
for row in rownew:
writer.writerow(row)
Я могу так же легко очистить время POSIX от твиттера, как описано выше. Мне не нужно преобразовывать метку времени из одного формата в другой. Мне нужно знать, как добавить определенное количество часов в каждую временную метку в списке. Кажется, что было бы проще использовать формат POSIX. Например, как я могу добавить 17 часов или 61200 секунд для каждого элемента в списке? –
Это (обновление в ответ), что вы имеете в виду? –
Функция 'str_to_ts' противоположна тому, что я искал.Теперь, когда я добавил 61200 секунд в каждое время POSIX, как мне преобразовать его обратно в формат hh: mm: ss MM/DD/YYYY? –