【问题标题】:How to get datetime with BeautifulSoup如何使用 BeautifulSoup 获取日期时间
【发布时间】:2020-12-17 04:51:41
【问题描述】:

我想把这个网站上的所有cmets都刮掉:https://fr.trustpilot.com/review/www.gammvert.fr

我想要评论、评分和日期。我设法获得了评论和评分,但没有获得日期。

到目前为止,这是我的脚本:

import requests
from requests import get
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np

root_url = 'https://fr.trustpilot.com/review/jardiland.com'
urls = [ '{root}?page={i}'.format(root=root_url, i=i) for i in range(1,9) ]

comms = []
notes = []
dates = []

for url in urls: 
    results = requests.get(url)

    soup = BeautifulSoup(results.text, "html.parser")

    commentary = soup.find_all('div', class_='review-content')

    for container in commentary:

        comm  = container.find('p', class_ = 'review-content__text').text.strip()
        comms.append(comm)

        note = container.find('div', class_ = 'star-rating star-rating--medium').find('img')['alt']
        notes.append(note)

        date = container.div.div.find('div', class_ = 'review-content-header__dates')
        dates.append(date)

data = pd.DataFrame({
    'comms' : comms,
    'notes' : notes,
    'dates' : dates
    })

data['comms'] = data['comms'].str.replace('\n', '')


#print(data.head())
data.to_csv('filetest.csv', sep=';', index=False)

这是日期的 html:html

我想要“日期时间”或“标题”,而不是文本,因为当它是最近的时,那不是指定的日期,而是像“两小时前”这样没有意义。

有什么想法吗?

非常感谢:)

【问题讨论】:

  • 这是由 javascript 显示的。不幸的是,请求没有出路。你需要去硒或scrapy splash。
  • 如果您将此javascript代码Array.from(document.getElementsByClassName("review-content-header__dates")).map(e=>e.textContent)粘贴到浏览器控制台中,您可以获得这些日期,但您需要清理它们。

标签: python python-3.x web-scraping beautifulsoup


【解决方案1】:

日期是动态加载的,因此requests 不支持它。但是,网站上的日期以 JSON 格式提供,您可以使用 re 模块找到它们,并使用 json 模块将它们转换为 dict

import re
import json
import requests
import numpy as np
import pandas as pd
from requests import get
from bs4 import BeautifulSoup


root_url = "https://fr.trustpilot.com/review/jardiland.com"
urls = ["{root}?page={i}".format(root=root_url, i=i) for i in range(1, 9)]

comms = []
notes = []
dates = []

for url in urls:
    results = requests.get(url)

    soup = BeautifulSoup(results.text, "html.parser")

    commentary = soup.find_all("div", class_="review-content")

    for container in commentary:

        comm = container.find("p", class_="review-content__text").text.strip()
        comms.append(comm)

        note = container.find("div", class_="star-rating star-rating--medium").find(
            "img"
        )["alt"]
        notes.append(note)

        date_tag = container.div.div.find("div", class_="review-content-header__dates")
        date = json.loads(re.search(r"({.*})", str(date_tag)).group(1))["publishedDate"]

        dates.append(date)


data = pd.DataFrame({"comms": comms, "notes": notes, "dates": dates})

data["comms"] = data["comms"].str.replace("\n", "")


print(data.head())
data.to_csv("filetest.csv", sep=";", index=False)

输出:

                                               comms  ...                      dates
0  Suite à un achat effectué fin novembre, j’ai e...  ...  2020-12-11T10:37:32+00:00
1  Aujourd'hui dans le magasin de Beaucouzé Anger...  ...  2020-12-05T17:28:57+00:00
2  A FUIR! Sur les deux commandes passée : - La p...  ...  2020-12-04T20:31:34+00:00
3  Si vous avez une réclamation évitez le Jardila...  ...  2020-12-01T07:18:55+00:00
4  Quelle honten ! J'ai acheté une nappe ce weeke...  ...  2020-11-25T10:01:31+00:00

[5 rows x 3 columns]

【讨论】:

    【解决方案2】:

    数据收集在 JSON_LD 中。确保您已获得 Trustpilot 的许可。

    import json
    from requests import Session
    from bs4 import BeautifulSoup
    URL = 'https://fr.trustpilot.com/review/jardiland.com?page=2'
    
    session = Session()
    r = session.get(URL)
    soup = BeautifulSoup(r.text)
    data = soup.find('script',{'type':'application/ld+json'})
    data_json = json.loads(data.getText(strip=True))
    
    # now you can assess data as dictionary
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 2020-06-02
      相关资源
      最近更新 更多