gpt4 book ai didi

python - 对非结构化列表中的日期字符串和关联值的数据进行格式化

转载 作者:行者123 更新时间:2023-12-01 07:26:51 25 4
gpt4 key购买 nike

我想将使用 beautiful soup 从网络抓取中获得的电影评论(日期和评论)保存到数据框中。每个发布日期至少有一条评论,并且每天可能有多条评论。

事实是,HTML 没有针对每个日期和相关评论的 div 结构,而是每个元素、日期和评论都是兄弟标签,依次排序。

这里是 html 的片段:

<div class="more line-bottom"> 
<a class="next" href="es/news/374528/cat/113418/#cm"> <span>anterior</span> <span class="icon"> </span> </a>
</div>


<div class="date">
<p>miércoles, 7 de agosto de 2019</p>
</div>

<div class="article clear-block no-photo">
<div class="box-text-article">
<p class="news-info">
<a href="es/newsdetail/376261">
<span>Dokufest 2019</span>
</a>
</p>
<h2>
<a href="es/newsdetail/376261">Crítica: <i>Aether</i></a>
</h2>
</div>
</div>


<div class="date">
<p>viernes, 2 de agosto de 2019</p>
</div>

<div class="article clear-block no-photo">
<div class="box-text-article">
<p class="news-info">
<a href="es/newsdetail/376044"><span>Peliculas / Reviews</span> </a>
</p>
<h2><a href="es/newsdetail/376044">Crítica: <i>Remember Me (Recuérdame)</i></a></h2>
</div>
</div>

<div class="article clear-block no-photo">
<div class="box-text-article">
<p class="news-info">
<a href="es/newsdetail/376041"><span>Peliculas / Reviews</span> </a>
</p>
<h2><a href="es/newsdetail/376041">Crítica: <i>Animals</i></a></h2>
</div>
</div>

我能够使用 for 循环和 .next_siblings 获取所有感兴趣的文本,但随后只能格式化涉及许多步骤的获得的文本。您可以建议一个更Pythonic的解决方案吗?我看过其他帖子,其中包含可能适用的解决方案,但前提是我有已知的元素长度。例如,使用元组并转换为字典,但由于每个日期可能有多个评论,因此该答案不适用。

这是我的网络抓取和格式化代码:

from bs4 import BeautifulSoup
import requests
import pandas as pd
from itertools import groupby

req = requests.get("https://www.cineuropa.org/es/news/cat/113418/")
soup = BeautifulSoup(req.text, "lxml")

# result is the container of the tags of interest.
result = soup.find("div", attrs = {'class':'grid-65'})

# This is the element prior to the list of movie reviews
prior_sib_1st_review = result.find("div", attrs= {'class':"more line-bottom"})

然后要做的就是使用日期 div 中存在的唯一属性将其与评论的标签区分开来,并将其添加到元组的头部。由于获取的数据是有序的,因此总会有一个日期,然后是可变数量的评论标题。我将标题添加到元组中,直到出现新的日期。我必须使用 try catch 来完成此操作,因为会出现错误。该列表以一些 unicode 结尾。

_list = []
tup = ()
for sibling in prior_sib_1st_review.next_siblings:
try:
if(list(sibling.attrs.values())[0][0] == "date"):
tup = (repr(sibling.text),)
else:
tup = tup + (repr(sibling.text),)

except AttributeError as error:
pass

_list.append(tup)

问题是我得到的元组以相同的日期开始,并且通过 for 循环增加其长度。因此,我删除了空元素和仅包含日期的元素:

_list_dedup = [item for item in _list if len(item)>1]

然后我按日期分组。

 group_list = []
for key, group in groupby(_list_dedup , lambda x: x[0]):
group_list.append(list(group))

最后保留列表中最长的元组,该元组包含每个日期的所有相关评论。

final_list = []
for elem in group_list:
final_list.append(max(elem))
df_ = pd.DataFrame(final_list)

最佳答案

您是否尝试过迭代所有 div,检查每个 div 的类,然后存储遇到的最近日期?我认为这是解决像您这样的问题的最常见的解决方案。例如:

from bs4 import BeautifulSoup
import requests

req = requests.get("https://www.cineuropa.org/es/news/cat/113418/")
soup = BeautifulSoup(req.text, "lxml")

# result is the container of the tags of interest.
result = soup.find("div", attrs = {'class':'grid-65'})
entries = {}
date = ""
for o in result.find_all('div'):
if 'date' in o['class']:
date = o.text
if 'box-text-article' in o['class']:
try:
entries[date].append(o)
except:
entries[date] = [o]
print(entries)

此示例的结果是一个以日期为键的字典以及与“box-text-article”类匹配的 BeautifulSoup 对象列表。由于日期始终位于相应的文章之前,因此总有一个日期可以匹配。您可以添加几行来获取标题、链接等。(中间的 try/except 位仅允许您为字典中尚未存在的日期创建新条目,或者在以下情况下附加到现有日期条目:已找到。)

关于python - 对非结构化列表中的日期字符串和关联值的数据进行格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57402368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com