- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这不是漂亮的代码,但我有一些代码可以从 HTML 文件中获取一系列字符串并为我提供一系列字符串:author
, title
, date
, length
, text
。我有 2000 多个 html 文件,我想浏览所有这些文件并将这些数据写入一个 csv 文件。我知道所有这些都必须包含在 for
中最终循环,但在此之前我很难理解如何从获取这些值到将它们写入 csv 文件。我的想法是首先创建一个列表或元组,然后将其写入 csv 文件中的一行:
the_file = "/Users/john/Code/tedtalks/test/transcript?language=en.0"
holding = soup(open(the_file).read(), "lxml")
at = holding.find("title").text
author = at[0:at.find(':')]
title = at[at.find(":")+1 : at.find("|") ]
date = re.sub('[^a-zA-Z0-9]',' ', holding.select_one("span.meta__val").text)
length_data = holding.find_all('data', {'class' : 'talk-transcript__para__time'})
(m, s) = ([x.get_text().strip("\n\r")
for x in length_data if re.search(r"(?s)\d{2}:\d{2}",
x.get_text().strip("\n\r"))][-1]).split(':')
length = int(m) * 60 + int(s)
firstpass = re.sub(r'\([^)]*\)', '', holding.find('div', class_ = 'talk-transcript__body').text)
text = re.sub('[^a-zA-Z\.\']',' ', firstpass)
data = ([author].join() + [title] + [date] + [length] + [text])
with open("./output.csv", "w") as csv_file:
writer = csv.writer(csv_file, delimiter=',')
for line in data:
writer.writerow(line)
我一生都无法弄清楚如何让Python尊重这些是字符串并且应该存储为字符串而不是字母列表的事实。 (上面的 .join()
是我试图弄清楚的。)
展望 future :以这种方式处理 2000 个文件是否更好/更高效,将它们剥离到我想要的内容并一次写入一行 CSV,还是在 pandas
中构建一个数据框更好?然后将其写入 CSV? (所有 2000 个文件 = 160MB,因此精简后,最终数据不能超过 100MB,因此这里的大小不是很大,但展望 future 大小可能最终会成为一个问题。)
最佳答案
这将抓取所有文件并将数据放入 csv 中,您只需将路径传递到包含 html 文件的文件夹和输出文件的名称:
import re
import csv
import os
from bs4 import BeautifulSoup
from glob import iglob
def parse(soup):
# both title and author are can be parsed in separate tags.
author = soup.select_one("h4.h12.talk-link__speaker").text
title = soup.select_one("h4.h9.m5").text
# just need to strip the text from the date string, no regex needed.
date = soup.select_one("span.meta__val").text.strip()
# we want the last time which is the talk-transcript__para__time previous to the footer.
mn, sec = map(int, soup.select_one("footer.footer").find_previous("data", {
"class": "talk-transcript__para__time"}).text.split(":"))
length = (mn * 60 + sec)
# to ignore time etc.. we can just pull from the actual text fragment and remove noise i.e (Applause).
text = re.sub(r'\([^)]*\)',"", " ".join(d.text for d in soup.select("span.talk-transcript__fragment")))
return author.strip(), title.strip(), date, length, re.sub('[^a-zA-Z\.\']', ' ', text)
def to_csv(patt, out):
# open file to write to.
with open(out, "w") as out:
# create csv.writer.
wr = csv.writer(out)
# write our headers.
wr.writerow(["author", "title", "date", "length", "text"])
# get all our html files.
for html in iglob(patt):
with open(html, as f:
# parse the file are write the data to a row.
wr.writerow(parse(BeautifulSoup(f, "lxml")))
to_csv("./test/*.html","output.csv")
关于python - 将一系列字符串(加上数字)写入一行 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37534849/
我已经搜索了对此的一种解释,但没有找到一种解释。在Prolog谓词的描述中,有时在变量名之前的问号,加号和减号是什么意思? 例: predicate(?Variable1,+Variable2,-Va
我正在尝试使用以下脚本 $(document).ready(function() { $('#item1_number_1').keyup(function() {
在下面的代码片段中考虑用注释的等价物替换第 8 行 1. private static String ipToText(byte[] ip) { 2. StringBuffer result = n
对于要在图表中显色的级别数要多的因子,我想用“其他”替换不在“前10名”中的任何级别。 替代问题:如何将因子水平降低到rcolorbrewer可以绘制为单独颜色的数量? 例如,如果我想从棒球数据中绘制
我想要一个通过 ssh 进入机器的命令,运行一个命令(cd 或执行脚本或 su),然后给我 shell。向 ssh 传递命令似乎总是退出。 我正在寻找的一些例子: 'ssh me@machine1 "
我正在尝试将引导工具提示附加到特定的全日历日 View td 元素。我可以从该元素上的 FC 单击事件获取 td 元素。如果我执行 console.dir(thing); 那么该元素将作为一个对象返回
我有一个脚本,应该循环遍历一系列 csv 文件以创建不同的有向图。当使用 matplotlib (plt.savefig()) 保存时,随着循环的进行,图表似乎会被保存在另一个图表之上。如果我使用 p
每当我输入数据库时,我都会使用strip_tags函数,每当我输出信息时,我都会使用htmlspecialchars。也就是说,如果我向数据库中引入类似的内容: Hello, Mr. John.
我想在我的网站上实现触摸屏自动滚动。示例可以在 Ubuntu 和 Windows 8 的界面中看到。 Ubuntu: window 8: 如果您快速向下滚动页面,松手后它会继续滚动并逐渐变慢。如果滚动
我正在尝试了解 Java 中的并发性。我知道同步,它在对象上创建一个监视器,之后另一个线程无法对该对象进行操作。 Volatile - 与处理器缓存有关,如果我使用它,所有线程都不会创建对象的副本。所
我最近将我的应用程序从使用自定义 SplashScreen(它只是一个带有计时器的表单加载主表单并自行关闭)更改为应用程序框架。 这是我所做的: 创建了一个新的 SplashScreenForm,用于
我想通过使用Sqoop作为Parquet文件将数据从Oracle导入到Hive。 我一直在尝试使用sqoop使用以下命令导入数据: sqoop import --as-parquetfile --co
我有一些使用 SpringJUnit4ClassRunner 运行的测试。我也刚刚迁移到 Log4j2,现在加载 log4j2.xml 配置文件时遇到问题,我总是收到此错误: ERROR Status
在正则表达式方面不是很好,但为什么在找到匹配项时 console.log 会触发两次? $('#name').keyup(function() { var regex = /[\€]/g;
我已经了解了 Spring Integration 4.2.0.RELEASE 中的新功能,用于通过 @EnableIntegrationManagement 注释和 捕获 channel 和处理程序
因此,我正在尝试将 vector 与智能指针一起使用,以便更轻松地进行内存管理,而且...好吧,我遇到了问题。这是我的代码的(大大缩短的)版本: bulletManager.h: class Bull
我正在制作游戏,我希望敌人绕圈移动,但敌人也应该不断向左移动。我尝试使用 CGPath 创建一个圆形路径并使其遵循该路径,然后添加一个不断向左移动的 SKAction。但节点似乎只是沿着 CGPath
我想写一个函数tokenize这需要 char s 来自迭代器。像这样: fn tokenize>(file: F) 如果我想使用 &str有了这个功能,我可以这样做: tokenize("foo".
我不确定我的理解是否正确 int i = 5; float f = 3.9; int result = i + f; 那么当int和float相加时,8.9就变成了8?这是否意味着
我想对相册进行更新突变,但在获取更新和返回值时遇到问题。 架构 Mongoose : var AlbumSchema = new Schema({ name: String, date
我是一名优秀的程序员,十分优秀!