如何递归读取目录中的所有html文件?

时间:2018-01-23 12:17:32

标签: python arrays python-3.x

我正在尝试将所有html文件Doctype打印到txt文件。我没有Python的经验,所以请耐心等待一下。 :)

最终脚本应该从html文件中删除元素,具体取决于html文件中设置的Doctype中给出的html版本。我也试图在PHP中列出文件,并且它在某种程度上起作用。我认为Python是完成这项任务的更好选择。

下面的脚本是我现在所拥有的,但是我无法弄清楚如何为每个"写一个"以递归方式获取arkivet文件夹中每个html文件的Doctype。我目前只打印文件名和扩展名,我不知道如何获取它的路径,或者如何利用BeautifulSoup编辑和从文件中获取信息。

import fnmatch
from urllib.request import urlopen as uReq
import os
from bs4 import BeautifulSoup as soup
from bs4 import Doctype

files = ['*.html']
matches = []

for root, dirnames, filenames in os.walk("arkivet"):
    for extensions in files:
        for filename in fnmatch.filter(filenames, extensions):
            matches.append(os.path.join(root, filename))
            print(filename)

匹配是一个数组,但我不确定如何在Python中正确处理它。我想将带有扩展名的文件名,文件名和它的doctype打印到root文本文件中。

脚本在使用Python 3.5的本地Vagrant Debian服务器上的CLI中运行(Python 2.x也存在)。所有文件和文件夹都存在于服务器public root下的名为arkivet(archive)的文件夹中。

任何帮助表示赞赏!我被困在这里:)

3 个答案:

答案 0 :(得分:2)

维卡斯的答案可能就是你所要求的,但如果他不正确地解释了这个问题,那么你应该知道你可以访问所有这三个变量,因为你需要这样做。重新循环,根,dirnames和文件名。您当前只打印基本文件名:

print(filename)

也可以打印完整路径:

print(os.path.join(root, filename))

Vikas通过使用不同的函数(os.listdir)解决了目录名称的缺失,但我认为这将失去递归的能力。

你发布的os.walk的组合,以及打开Vikas的文件阅读文件的内部可能是你想要的?

答案 1 :(得分:1)

由于你没有标记任何答案解决方案,我猜你从来没有得到你的回答。这里有一大块代码递归搜索文件,打印完整的文件路径,并在html文件中显示Doctype字符串(如果存在)。

import os
from bs4 import BeautifulSoup, Doctype

directory = '/home/brian/Code/sof'
for root, dirnames, filenames in os.walk(directory):
    for filename in filenames:
        if filename.endswith('.html'):
            fname = os.path.join(root, filename)
            print('Filename: {}'.format(fname))
            with open(fname) as handle:
                soup = BeautifulSoup(handle.read(), 'html.parser')
                for item in soup.contents:
                    if isinstance(item, Doctype):
                        print('Doctype: {}'.format(item))
                        break

答案 2 :(得分:0)

如果您想阅读特定目录中的所有html文件,可以试试这个:

import os
from bs4 import BeautifulSoup

directory ='/Users/xxxxx/Documents/sample/'
for filename in os.listdir(directory):
     if filename.endswith('.html'):
         fname = os.path.join(directory,filename)
         with open(fname, 'r') as f:
             soup = BeautifulSoup(f.read(),'html.parser')
             # parse the html as you wish