如何循环 python 读取一组 HTML 文件并转储到 JSON

Posted

技术标签:

【中文标题】如何循环 python 读取一组 HTML 文件并转储到 JSON【英文标题】:How to loop python to read a set of HTML files and dump into JSON 【发布时间】:2014-06-11 19:37:36 【问题描述】:

我有一个程序可以从一组 20 个 html 文件中提取某些变量。有人可以给我建议如何循环程序以从目录中读取所有 html 文件并打印单个 json 文档中的信息吗?

from bs4 import BeautifulSoup

#opens data file
get_data = open("book1.html",'r').read()


#parses the html
soup = BeautifulSoup(get_data)

# finds title and author

title = soup.find("span", id="btAsinTitle")
author = title.find_next("a", href=True)

# finds price
for definition in soup.findAll('span', "class":'bb_price'):
    definition = definition.renderContents()

#finds ISBN, Shipping Weight, Product Dimensions
print soup.find('b', text='ISBN-10:').next_sibling
print soup.find('b', text='Shipping Weight:').next_sibling


#prints all the information

print definition
print title.get_text()
print author.get_text()

【问题讨论】:

【参考方案1】:

您可以使用glob.iglob 循环访问目录中的所有html 文件。对于每个文件名,将类文件对象传递给BeautifulSoup 构造函数,获取您需要的元素并构造一个字典:

import glob
from bs4 import BeautifulSoup

for filename in glob.iglob('*.html'):
    with open(filename) as f:
        soup = BeautifulSoup(f)

        title = soup.find("span", id="btAsinTitle")
        author = title.find_next("a", href=True)
        isbn = soup.find('b', text='ISBN-10:').next_sibling
        weight = soup.find('b', text='Shipping Weight:').next_sibling

        print 'title': title.get_text(),
               'author': author.get_text(),
               'isbn': isbn,
               'weight': weight

【讨论】:

这是一个很好的答案,但您知道如何将这些变量导出为 json 吗? @user2962786 是的,您可以使用json.dumps()json.dump() 来完成。【参考方案2】:

处理某个目录中的文件集:

from glob import glob
fnames = glob("datadir/*.html")
for fname in fnames:
  html2json(fname)

现在我们需要函数 html2json,它会获取 html 文件的名称,并将 json 字符串写入与 html 同名但添加了 json 扩展名的文件。

import json
from bs4 import BeautifulSoup

def html2json(fname):
  resdct = 
  with open(fname) as f:
    soup = BeautifulSoup(f)

    title = soup.find("span", id="btAsinTitle")
    resdct["title"] = title.get_text()
    resdct["author"] = title.find_next("a", href=True).get_text()
    resdct["isbn"] = soup.find('b', text='ISBN-10:').next_sibling.get_text()
    resdct["weight"] = soup.find('b', text='Shipping Weight:').next_sibling.get_text()

  outfname = fname + ".json"
  with open(outfname, "w") as f:
    json.dump(resdct, f)

【讨论】:

非常感谢您的回复,但它会将新文件转储到目录中吗?我找不到输出文件 @user2962786 很好,我有一个错误,上次打开时缺少“w”模式。已更正。再试一次。

以上是关于如何循环 python 读取一组 HTML 文件并转储到 JSON的主要内容,如果未能解决你的问题,请参考以下文章

读取json文件,并使用python打印键值

在循环中跳过一组值(在数组中) - Python3

如何读取 XML 文件并删除一组标签

python之读取文件信息

如何从二进制文件中读取块并使用 Python 或 Perl 解包提取结构?

python基础-读取文件