ElementTree 错误,html 文件将不会使用 Python/Sublime 进行解析
ElementTree errors, html files will not parse using Python/Sublime
我正在尝试解析几千个 html 文件并将变量转储到 csv 文件(excel 电子表格)。我遇到了几个障碍,但第一个是:我无法正确解析文件。下面是一个简短的解释,python 代码和回溯信息。
使用 Python & Sublime 解析 html 文件,我遇到了几个错误。什么是工作:它运行良好,直到 if '.html' in file:
。它不执行该循环。它会遍历 print allFiles
就好了。它还会创建 csv 文件并创建 headers(虽然不在单独的列中,但我可以稍后询问)。
看来问题出在if tree = ET.parse(HTML_PATH+"/"+file)
这块。我已经用几种不同的方式写了这个(例如,没有“/” and/or "file")——到目前为止我还没有解决这个问题。
如果我能提供更多信息或者有人能指导我查看其他文档,将不胜感激。到目前为止,我还没有找到任何解决这个问题的方法。
非常感谢您的想法。
//C
# Parses out data from crawled html files under "html files"
# and places the output in output.csv.
import xml.etree.ElementTree as ET
import csv, codecs, os
from cStringIO import StringIO
# Note: you need to download and install this..
import unicodecsv
# TODO: make into command line params (instead of constant)
CSV_FILE='output.csv'
HTML_PATH='/Users/C/data/Folder_NS'
f = open(CSV_FILE, 'wb')
w = unicodecsv.writer(f, encoding='utf-8', delimiter=';')
w.writerow(['file', 'category', 'about', 'title', 'subtitle', 'date', 'bodyarticle'])
# redundant declarations:
category=''
about=''
title=''
subtitle=''
date=''
bodyarticle=''
print "headers created"
allFiles = os.listdir(HTML_PATH)
#with open(CSV_FILE, 'wb') as csvfile:
print "all defined"
for file in allFiles:
#print allFiles
if '.html' in file:
print "in html loop"
tree = ET.parse(HTML_PATH+"/"+file)
print '===================='
print 'Parsing file: '+file
print '===================='
for node in tree.iter():
print "tbody"
# The tbody attribute spells it all (or does it):
name = node.attrib.get('/html/body/center/table/tbody/tr/td/table/tbody/tr[3]/td/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[1]/font')
# Check common header stuff
if name=='/html/body/center/table/tbody/tr/td/table/tbody/tr[3]/td/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[1]/font':
#print ' ------------------'
#print ' Category:'
category=node.text
print "category"
f.close()
回溯:
文件“/Users/C/data/Folder_NS/data_parse.py”,第 34 行,在
树 = ET.parse(HTML_PATH+"/"+文件)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py”,第 1182 行,在解析中
tree.parse(来源,解析器)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py”,第 656 行,在解析中
parser.feed(数据)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py”,第 1642 行,在提要中
self._raiseerror(v)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py”,第 1506 行,在 _raiseerror
提出错误
xml.etree.ElementTree.ParseError:标签不匹配:第 63 行,第 2 列
您正在尝试使用 XML 解析器解析 HTML,有效的 HTML 并不总是有效的 XML。您最好使用 lxml 包中的 HTML 解析库。
import xml.etree.ElementTree as ET
# ...
tree = ET.parse(HTML_PATH + '/' + file)
将改为
import lxml.html
# ...
tree = lxml.html.parse(HTML_PATH + '/' + file)
我正在尝试解析几千个 html 文件并将变量转储到 csv 文件(excel 电子表格)。我遇到了几个障碍,但第一个是:我无法正确解析文件。下面是一个简短的解释,python 代码和回溯信息。
使用 Python & Sublime 解析 html 文件,我遇到了几个错误。什么是工作:它运行良好,直到 if '.html' in file:
。它不执行该循环。它会遍历 print allFiles
就好了。它还会创建 csv 文件并创建 headers(虽然不在单独的列中,但我可以稍后询问)。
看来问题出在if tree = ET.parse(HTML_PATH+"/"+file)
这块。我已经用几种不同的方式写了这个(例如,没有“/” and/or "file")——到目前为止我还没有解决这个问题。
如果我能提供更多信息或者有人能指导我查看其他文档,将不胜感激。到目前为止,我还没有找到任何解决这个问题的方法。
非常感谢您的想法。
//C
# Parses out data from crawled html files under "html files"
# and places the output in output.csv.
import xml.etree.ElementTree as ET
import csv, codecs, os
from cStringIO import StringIO
# Note: you need to download and install this..
import unicodecsv
# TODO: make into command line params (instead of constant)
CSV_FILE='output.csv'
HTML_PATH='/Users/C/data/Folder_NS'
f = open(CSV_FILE, 'wb')
w = unicodecsv.writer(f, encoding='utf-8', delimiter=';')
w.writerow(['file', 'category', 'about', 'title', 'subtitle', 'date', 'bodyarticle'])
# redundant declarations:
category=''
about=''
title=''
subtitle=''
date=''
bodyarticle=''
print "headers created"
allFiles = os.listdir(HTML_PATH)
#with open(CSV_FILE, 'wb') as csvfile:
print "all defined"
for file in allFiles:
#print allFiles
if '.html' in file:
print "in html loop"
tree = ET.parse(HTML_PATH+"/"+file)
print '===================='
print 'Parsing file: '+file
print '===================='
for node in tree.iter():
print "tbody"
# The tbody attribute spells it all (or does it):
name = node.attrib.get('/html/body/center/table/tbody/tr/td/table/tbody/tr[3]/td/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[1]/font')
# Check common header stuff
if name=='/html/body/center/table/tbody/tr/td/table/tbody/tr[3]/td/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[1]/font':
#print ' ------------------'
#print ' Category:'
category=node.text
print "category"
f.close()
回溯:
文件“/Users/C/data/Folder_NS/data_parse.py”,第 34 行,在 树 = ET.parse(HTML_PATH+"/"+文件) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py”,第 1182 行,在解析中 tree.parse(来源,解析器) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py”,第 656 行,在解析中 parser.feed(数据) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py”,第 1642 行,在提要中 self._raiseerror(v) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py”,第 1506 行,在 _raiseerror 提出错误 xml.etree.ElementTree.ParseError:标签不匹配:第 63 行,第 2 列
您正在尝试使用 XML 解析器解析 HTML,有效的 HTML 并不总是有效的 XML。您最好使用 lxml 包中的 HTML 解析库。
import xml.etree.ElementTree as ET
# ...
tree = ET.parse(HTML_PATH + '/' + file)
将改为
import lxml.html
# ...
tree = lxml.html.parse(HTML_PATH + '/' + file)