我需要从html文件集合中提取一些数据。我不确定数据是否存在于div元素,表元素或组合元素中(其中div标签是表的元素。我已经看到了所有这三种情况。我的文件很大 - 大到2 mb并且我有成千上万的人。到目前为止,我已经查看了表格中的td元素并查看了孤独的div元素。在我看来,最长的时间是将文件加入我花了很多时间创建一个正则表达式来查找我要查找的数据,然后查找下一个关闭的tag-table,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)
然后,我可以使用newString访问BeautifulSoup的强大功能。
这比第一次测试所有表中所有单元格内容的替代方法运行得快得多,直到我找到我的文本,如果我找不到它,那么测试所有div内容。
我在这里遗漏了什么吗?
答案 0 :(得分:3)
你试过lxml
吗? BeautifulSoup很好,但不是超快,我相信lxml
可以提供相同的质量,但通常会有更好的表现。
答案 1 :(得分:3)
BeautifulSoup在内部使用正则表达式(它将它与其他XML解析器分开),因此您可能会发现自己只是在重复它的作用。如果你想要一个更快的选项,那么先使用try / catch尝试lxml或etree解析,然后尝试使用BeautifulSoup和/或tidylib解析破解的HTML,如果解析器失败。
看起来你正在做什么,你真的想使用XPath或XSLT来查找和检索你的数据,lxml可以做到这两点。
最后,考虑到文件的大小,您可能应该使用路径或文件句柄进行解析,以便可以逐步读取源,而不是保存在内存中以进行解析。
答案 2 :(得分:1)
我不太明白你想做什么。但我知道你不需要用&lt; HTML&GT;标签。 BS会解析那个问题。
答案 3 :(得分:1)
我发现即使lxml比BeautifulSoup快,对于那些通常最好尝试通过正则表达式(或直接剥离)将大小减小到几KB的文档,并将其加载到BS中,就像你正在做的那样现在