Python 如何批量解析(例如,提取特定的文本元素)一个.html文件目录,然后将每个元素添加到数据框中?

Python 如何批量解析(例如,提取特定的文本元素)一个.html文件目录,然后将每个元素添加到数据框中?,python,pandas,parsing,Python,Pandas,Parsing,假设我有一个.html文件目录,每个文件的结构都相同,尽管每个标签中包含不同的内容。每个.html文件本质上都是一篇新闻文章,我在其中使用BeautifulSoup提取日期、作者、文章文本、源代码和字数 我在下面发布的代码就是我为实现这一点而开发的,并且似乎工作得很好 但是,我需要完成两件事:首先,我需要脚本能够批处理整个.html文件目录,而不是一次打开一个。其次,我需要将所有提取的数据附加到一个pandas数据框中,我最终会将其写入.csv 对于上下文,我有大约3000个.html文件和新闻

假设我有一个.html文件目录,每个文件的结构都相同,尽管每个标签中包含不同的内容。每个.html文件本质上都是一篇新闻文章,我在其中使用BeautifulSoup提取日期、作者、文章文本、源代码和字数

我在下面发布的代码就是我为实现这一点而开发的,并且似乎工作得很好

但是,我需要完成两件事:首先,我需要脚本能够批处理整个.html文件目录,而不是一次打开一个。其次,我需要将所有提取的数据附加到一个pandas数据框中,我最终会将其写入.csv

对于上下文,我有大约3000个.html文件和新闻文章要处理

在此方面的任何帮助都将不胜感激!谢谢你抽出时间

作为pd进口熊猫 从bs4导入BeautifulSoup soup=BeautifulSoupopentest.html,html.parser 日期=汤。选择“span.显示日期”[0]。text.strip title=soup。选择“h1.document-view\u title”[0]。text.strip article=soup.findAll'div',attrs={class:document-view\uuuu body-document-view\uuuuuuu body-ascii} 对于第条中的x: printx.find'p'。文本 author=soup。选择“span.author”[0]。text.strip source=soup。选择“span.source”[0]。text.strip wordcount=soup。选择“span.word count”[0]。text.strip
如果没有示例数据,我猜不出您想要做什么,但请这样做

import glob
import pandas as pd
from bs4 import BeautifulSoup

pandas_list = []
for filename in glob.glob('*.html'):
    soup = BeautifulSoup(open(filename), "html.parser")
    new_data_frame = process_soup(s)
    pandas_list.append(new_data_frame)

final_data_frame = pd.concat(pandas_list)
我将给你布置以下作业:

def process_soup(s):
    data = {'author': s.select('span.author')[0].text.strip(),
            'source': s.select('span.source')[0].text.strip()}
    return pd.DataFrame(data, index=[0])
完成任何你想提取出来的东西

在本例中,创建了一个包含10个线程的池。你可以根据你的机器规格增加数量

还要注意,我无法理解文章字段的体系结构,但这对于一般概念来说并不重要

从multiprocessing.dummy导入池作为线程池 从bs4导入BeautifulSoup 作为pd进口熊猫 从操作系统导入漫游 池=线程池10 更新:获取目录中的所有html文件,而不是将它们提供给脚本 htmls=[] 对于walk'./目录中的根目录、目录、文件(包含html文件): 对于文件中的文件: 如果r'.*\.html'.matchfile: htmls.appendfile htmls=[ “file1.html”, “file2.html”, “file3.html” ... ] df=pd.DataFramecolumns=['date','title','author','source','wordcount'] 数据列表=[] def crawl_htmlhtml_文件: soup=BeautifulSoupopenhtml_文件'html.parser' 数据\u list.append{ “日期”:汤。选择“span.显示日期”[0]。text.strip “标题”:汤。选择“h1.document-view\u title”[0]。text.strip “作者”:汤。选择“span.author”[0]。text.strip “源”:汤。选择“span.source”[0]。text.strip “字数”:汤。选择“span.word count”[0]。text.strip } 结果=pool.mapcrawl\u html,htmls printdf.appenddata\u列表 游泳池关闭 pool.join
你好,这是我的数据样本我想提取作者、文章标题、日期、来源和文章文本。我可以用上面发布的代码做到这一点,我只是不知道如何迭代我目录中的每个文件,然后为pandas数据帧将author变量分配给类似df['author']的东西。这很有效!我只是在你的代码中用“soup”替换了“s”。在这个解决方案中,我必须指定我的每个.html文件名吗?你可以给python一个目录并扫描其中的文件,将用一个示例更新我的答案这看起来像是它一次处理多个事情,但由于python中的GIL,它将一次处理一个。您可以更好地尝试将生成作为一个单独的进程,并尝试比较两者的性能。