这是我解析html文件的代码。解析表后,我需要将每条记录存储在文件中,并且每条记录后都需要换行符,记录中的每个元素都应该用逗号分隔。我设法得到了换行符,但没有得到逗号。
这是我的代码:
from BeautifulSoup import BeautifulSoup
import re
import os
OUTFILE = os.path.join('company', 'a', 'viewids')
soup = BeautifulSoup(open("/company/a/searches/a"))
rows = soup.findAll("table",{"id":"cos"})
records = []
for tr in rows:
cols = tr.findAll('td')
for td in cols:
record = td.contents[0]
records.append(record+'n')
open(OUTFILE, 'w').writelines(records)
这是记录:
A CONSULTING TEAM INC 1040792 7380
A J&J PHARMA CORP 1140452 9995
My output is:
A CONSULTING TEAM INC
1040792
7380
A J&J PHARMA CORP
1140452
9995
号分隔值
您描述的文件格式只是 CSV 格式。浏览维基百科并搜索"逗号分隔值"。
使用 Python,您可以使用 csv
包。转到 http://docs.python.org/2/library/csv.html 以查看文档。
编写 CSV 文件的最简单方法如下:
import csv
records = [[1951, 'Superman and the Mole Men', 'DC Comics', 'Lee Sholem'],
[1966, 'Batman', 'DC Comics', 'Leslie H. Martinson'],
[2002, 'Spider-Man', 'Marvel Comics', 'Sam Raimi'],
[2008, 'Iron Man', 'Marvel Comics', 'Jon Favreau']]
with open('heros.csv', 'wb') as fp:
writer = csv.writer(fp)
writer.writerows(records)
结果是一个经典的 CSV 文件:
1951,Superman and the Mole Men,DC Comics,Lee Sholem
1966,Batman,DC Comics,Leslie H. Martinson
2002,Spider-Man,Marvel Comics,Sam Raimi
2008,Iron Man,Marvel Comics,Jon Favreau
当然,您可以添加标题:
with open('heros.csv', 'wb') as fp:
writer = csv.writer(fp)
writer.writerows([['Year', 'Film', 'Publisher', 'Director']])
writer.writerows(records)
注意:标题是列表列表(查看双括号(
结果是以下 CSV 文件:
Year,Film,Publisher,Director
1951,Superman and the Mole Men,DC Comics,Lee Sholem
1966,Batman,DC Comics,Leslie H. Martinson
2002,Spider-Man,Marvel Comics,Sam Raimi
2008,Iron Man,Marvel Comics,Jon Favreau
读取 HTML 表
首先,使用 with
语句以安全的方式打开文件。
例如,要读取文本文件,请按如下方式处理:
with open('sample.txt', 'r') as fp:
content = fp.read()
这样,如果在读取过程中发生错误,文件将自动在引发异常之前,在 with
语句的末尾关闭。什么都没有打开!
要读取带有BeautifulSoup
的 HTML 表(我不知道(,您可以执行以下操作:
with open("/company/a/searches/a") as html_file:
soup = BeautifulSoup(html_file)
rows = soup.findAll("table", {"id": "cos"})
records = []
for tr in rows:
record = []
cols = tr.findAll('td')
for td in cols:
record.append(td.contents[0])
records.append(record)
records
列表将包含整个表。然后,您可以将其写入 CSV 文件。
处理 UNICODE 值
HTML 不包含 ASCII 字符串,但包含 UNICODE 字符串,我想 td.contents[0]
将返回一个unicode
实例。
但是,csv
模块并不直接支持读取和写入 Unicode。因此,UTF-8
unicode
您需要在CSV 序列化。我建议你看看unicode_csv_reader()
函数在示例中:http://docs.python.org/2/library/csv.html#examples。
rows = soup.findAll("table",{"id":"cos"})[0].findAll('tr')
records = []
for tr in rows:
cols = tr.findAll('td')
record = ''
for td in cols:
if record != '': record = record + ', '
record = record + td.contents[0]
records.append(record + "n")