【问题标题】:Parsing local files with lxml.etree使用 lxml.etree 解析本地文件
【发布时间】:2015-02-07 10:26:58
【问题描述】:

对于任何不清楚的地方,我提前道歉(我是编程新手)。我正在尝试使用 lxml.etree 解析一组本地文件。我使用 lxml(和 xpath)编写了一个解析脚本,该脚本从 SEC 网页中查找相关数据并导出到 .csv 文件。该脚本适用于单个 url,但我想推广到数千个 html 页面。我已经在本地下载了所有 html 文件(我使用 curl 获取链接,使用 wget 下载)——但我在替换解析器方面没有任何成功。有效的旧版本是:

page = requests.get('url')
tree = html.fromstring(page.text)

我尝试用 etree.parse 替换它,以便解析本地下载在“Bullseye”目录中的文件

path = "/Users/dbk13/Desktop/SEC/bullseye"
dirs = os.listdir( path )

for files in dirs: 
    page = os.path.join(path,files)
    etree.parse(page)

我的本​​地文件路径有问题吗?

我不断收到的错误类似于:

文件“postings_up_updated.py”,第 26 行,在 etree.parse(page) 文件“lxml.etree.pyx”,第 3299 行,在 lxml.etree.parse (src/lxml/lxml.etree.c:72421) 文件“parser.pxi”中, 第 1791 行,在 lxml.etree._parseDocument (src/lxml/lxml.etree.c:105883) 文件“parser.pxi”,第 1817 行,位于 lxml.etree._parseDocumentFromURL (src/lxml/lxml.etree.c:106182) 文件“parser.pxi”,第 1721 行,在 lxml.etree._parseDocFromFile (src/lxml/lxml.etree.c:105181) 文件 “parser.pxi”,第 1122 行,在 lxml.etree._BaseParser._parseDocFromFile (src/lxml/lxml.etree.c:100131) 文件“parser.pxi”,第 580 行,在 lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:94254) 文件“parser.pxi”,第 690 行,在 lxml.etree._handleParseResult (src/lxml/lxml.etree.c:95690) 文件 “parser.pxi”,第 620 行,在 lxml.etree._raiseParseError (src/lxml/lxml.etree.c:94757) lxml.etree.XMLSyntaxError: 文档是 空,第 1 行,第 1 列

【问题讨论】:

  • 空文件不是有效的 XML 文档!显然,/Users/dbk13/Desktop/SEC/bullseye 中有一个空文件。

标签: python parsing path lxml elementtree


【解决方案1】:

错误消息表明该文件是空的,但是,我认为您更有可能尝试解析一个目录,就好像它是一个文件一样。此代码产生与您显示的相同的回溯:

from lxml import etree

etree.parse('/tmp')
Traceback (most recent call last):
.
.
lxml.etree.XMLSyntaxError: Document is empty, line 1, column 1

如果“/Users/dbk13/Desktop/SEC/bullseye”中有子目录,则可能会发生这种情况,因为os.listdirs() 将在返回的列表中包含子目录。如果是这种情况,您可以尝试使用os.path.isfile() 检查常规文件:

import os

path = "/Users/dbk13/Desktop/SEC/bullseye"
dirs = os.listdir( path )

for filename in dirs:
    page = os.path.join(path, filename)
    if os.path.isfile(page):
        etree.parse(page)

另一点值得一提的是,您似乎正在尝试使用 XML 解析器来解析 HTML 文件。这不太可能成功,因为绝大多数 HTML 文件不是 XML,因此无法使用 XML 解析器可靠地解析。我推荐lxml.html,但你似乎已经尝试过了。另一种可选的 HTML 解析器是 BeautifulSoup

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2013-07-30
    • 2017-10-24
    相关资源
    最近更新 更多