- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将使用 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/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!