Python 如何批量解析(例如,提取特定的文本元素)一个.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.stripPython 如何批量解析(例如,提取特定的文本元素)一个.html文件目录,然后将每个元素添加到数据框中?,python,pandas,parsing,Python,Pandas,Parsing,假设我有一个.html文件目录,每个文件的结构都相同,尽管每个标签中包含不同的内容。每个.html文件本质上都是一篇新闻文章,我在其中使用BeautifulSoup提取日期、作者、文章文本、源代码和字数 我在下面发布的代码就是我为实现这一点而开发的,并且似乎工作得很好 但是,我需要完成两件事:首先,我需要脚本能够批处理整个.html文件目录,而不是一次打开一个。其次,我需要将所有提取的数据附加到一个pandas数据框中,我最终会将其写入.csv 对于上下文,我有大约3000个.html文件和新闻
如果没有示例数据,我猜不出您想要做什么,但请这样做
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,它将一次处理一个。您可以更好地尝试将生成作为一个单独的进程,并尝试比较两者的性能。