一旦我使用lxml识别出html文档的一部分的开头和结尾部分,我如何获取它们之间的所有内容

时间:2010-08-17 04:03:10

标签: python html parsing lxml

我正在使用一些html文件。我试图找到一种方法来持续获取文档中存在的一些文本。我知道我想要的部分以一些粗体字开头,我知道该部分以其他粗体字结尾。

bolded_item=atree.cssselect('b')

myKeys=[item for item in bolded_items if item.text if 'KEY' in item.text]

所以myKeys是一个列表,其成员是来自atree的元素,特别是具有粗体文本并在文本中包含“KEY”字样的元素。

我现在想要识别myKeys中任何2个元素之间树的所有部分,我希望能够以各种方式操作它们。我正在玩getparent,getchildren getnext和所有其他看起来可能在运行dir(myKeys [0])之后的方法,但我没有取得进展。

任何建议都将不胜感激

2 个答案:

答案 0 :(得分:1)

我建议使用SAX来完成这项任务。

基本文档位于http://lxml.de/sax.html#producing-sax-events-from-an-elementtree-or-element

你的处理程序应该消耗任何动作的事件,直到它收到所需的粗体项,然后它将事件写入新的缓冲区/树/任何东西,直到它收到终止的粗体项。

答案 1 :(得分:0)

本着SO的精神,我已经想出了我认为最好的答案,我将自己发布。

import lxml
from lxml import html
testFile=open(r'c:\temp\testlxml.htm').read()
aTree=html.fromstring(testFile)
bolds=aTree.cssselect('b')
theTitles=[item.text for item in bolds if item.text if 'KEY' in item.text]
theBoldKeys=[item for item in bolds if item.text if 'KEY' in item.text]
theFullList=[]
for e in aTree.iter():
    theFullList.append(e)

for numb,item in enumerate(theFullList):
    if item==theBoldItems[0]:
        first=numb
    if item==theBoldItems[1]:
        second=numb
theText=[]
for item in theFullList[first:second]:
    if item.text:
        theText.append(item.text)
    if item.tail:
       theText.append(item.tail)

aString=' '.join(theText)

一点点解释。

我的目标是将一些逻辑应用于文档的粗体部分,因为那些带有单词KEY的粗体部分定义了文档的不同部分。 TheTitles是包含“KEY”一词的粗体元素列表。根据我的特殊需要,我可能想要来自theTitles的任何两个项目之间的所有文本,我可以创建测试和必要的逻辑来从标题中选择项目。

theBoldItems是实际元素的列表,对于任何i theTitles [i] == theBoldItems [i] .text

接下来我得到了theFullList,它是树中的所有htm元素。因为LXML按顺序构建树我知道我想要捕获所有元素theBoldItems [i]和theBoldItems [i + 1]。好的是,Python构建测试的方式非常简单。

我现在可以获取所有这些内容的文本,虽然我仍然需要清理它,但我已经成功地删除了我可能想要的任何两个项目之间的所有文本。