Соскоб на основе даты с BeautifulSoup - PullRequest
0 голосов
/ 25 февраля 2019

Я очень новичок в программировании на Python.Акцент на ОЧЕНЬ.Я пытаюсь настроить свой первый проект очистки веб-страниц (для курирования новостных статей).

Мне уже удалось очистить сайт новостей и создать цикл, который организует результаты так, как я хочу.Моя проблема в том, что я планирую очищать веб-страницу один раз в день, но только для публикаций, которые были опубликованы в тот же день.Я не хочу их всех, потому что это означало бы, что я получу много повторений.

Я знаю, что это как-то связано с преобразованием даты через модуль datetime (с оператором if), ноя не мог найти способ заставить его работать.

В html, это пример того, как отображается дата:

<time datetime="2019-02-24T10:30:46+00:00">Feb 24, 2019 at 10:30</time>

Вот чтоУ меня так далеко:

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
from datetime import datetime

my_url = "https://www.coindesk.com/category/business-news/legal"

# Opening up the website, grabbing the page
uFeedOne = uReq(my_url, timeout=5)
page_one = uFeedOne.read()
uFeedOne.close()

# html parser
page_soup1 = soup(page_one, "html.parser")

# grabs each publication block
containers = page_soup1.findAll("a", {"class": "stream-article"} )

for container in containers:
  link = container.attrs['href']
  publication_date = "published on " + container.time.text
  title = container.h3.text
  description = "(CoinDesk)-- " +  container.p.text

  print("link: " + link)
  print("publication_date: " + publication_date)
  print("title: " + title)
  print("description: " + description)  

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Ваш тег time имеет атрибут datetime, который дает намного лучшее представление datetime, чем текст.Используйте это.

Вы можете использовать пакет dateutil для анализа строки.Ниже приведен пример кода:

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
from datetime import datetime, timedelta
from dateutil import parser
import pytz

my_url = "https://www.coindesk.com/category/business-news/legal"

# Opening up the website, grabbing the page
uFeedOne = uReq(my_url, timeout=5)
page_one = uFeedOne.read()
uFeedOne.close()

# html parser
page_soup1 = soup(page_one, "html.parser")

# grabs each publication block
containers = page_soup1.findAll("a", {"class": "stream-article"} )

for container in containers:
  ## get todays date.
  ## I have taken an offset as the site has older articles than today.
  today =  datetime.now() - timedelta(days=5)
  link = container.attrs['href']

  ## The actual datetime string is in the datetime attribute of the time tag.
  date_time = container.time['datetime']

  ## we will use the dateutil package to parse the ISO-formatted date.
  date = parser.parse(date_time)

  ## This date is UTC localised but the datetime.now() gives a "naive" date
  ## So we have to localize before comparison
  utc=pytz.UTC
  today = utc.localize(today)

  ## simple comparison
  if date >= today:
      print("article date", date)
      print("yesterday", today," \n")
      publication_date = "published on " + container.time.text
      title = container.h3.text.encode('utf-8')
      description = "(CoinDesk)-- " +  container.p.text

      print("link: " + link)
      print("publication_date: " + publication_date)
      print("title: ", title)
      print("description: " + description)
0 голосов
/ 25 февраля 2019

Дата представлена ​​в формате ISO 8601 .Извлеките атрибут datetime в виде строки из тега time.Если вы используете Python 3.7, вы можете использовать метод datetime.datetime.fromisoformat, чтобы преобразовать его в объект datetime и затем выполнить сравнение.Если вы используете более старую версию python, я думаю, что самый простой подход - это посмотреть вопрос и первый ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...