0

我有一些需要从 html 文件集合中提取的数据。我不确定数据是否驻留在 div 元素、table 元素或组合元素中(其中 div 标签是 table 的元素。我见过所有三种情况。我的文件大到 2 mb 和我有数万个。到目前为止,我已经查看了表格中的 td 元素并查看了孤独的 div 元素。在我看来,最长的时间是文件被汤化,超过 30 秒。我尝试创建一个正则表达式来查找我要查找的数据,然后查找下一个关闭标记表、tr、td 或 div 以确定我的文本包含在哪种类型的结构中。找到匹配的打开标记,剪切该部分,然后将其全部包装在打开和关闭 HTML 标记中

 stuff

 <div>
 stuff
 mytext
 stuff
 </div>

所以我创建了一个看起来像这样的字符串:

s='<div>stuffmyTextstuff</div>'

然后我包装字符串

 def stringWrapper(s):
     newString='<HTML>'+s+'</HTML>'
     return newString

然后使用 BeautifulSoup

littleSoup=BeautifulSoup(newString)

然后我可以访问 BeautifulSoup 的强大功能,用 newString 做我想做的事。

这比首先测试所有表格的所有单元格内容直到我找到我的文本并且如果我找不到它那里测试所有 div 内容的替代方法运行得快得多。

我在这里错过了什么吗?

4

4 回答 4

3

你试过lxml吗?BeautifulSoup 很好,但速度不是很快,我相信lxml它可以提供相同的质量,但通常性能更好。

于 2009-05-19T02:11:37.763 回答
3

BeautifulSoup 在内部使用正则表达式(这是它与其他 XML 解析器的区别),因此您可能会发现自己只是在重复它所做的事情。如果您想要一个更快的选项,请先使用 try/catch 尝试 lxml 或 etree 解析,然后在解析器失败时尝试 BeautifulSoup 和/或 tidylib 解析损坏的 HTML。

对于您正在做的事情,您似乎真的想使用 XPath 或 XSLT 来查找和检索您的数据,lxml 两者都可以。

最后,考虑到文件的大小,您可能应该使用路径或文件句柄进行解析,以便可以增量读取源而不是保存在内存中进行解析。

于 2009-05-19T02:42:28.687 回答
1

我发现即使 lxml 比 BeautifulSoup 快,对于这种大小的文档,通常最好尝试通过正则表达式(或直接剥离)将大小减小到几 kB 并将其加载到 BS 中,就像你现在所做的那样。

于 2009-05-19T03:26:33.213 回答
1

我不太明白你想做什么。但我知道你不需要用 < html> 标签括起来你的 div 字符串。BS会很好地解析它。

于 2009-05-19T02:47:00.673 回答