一旦我使用lxml确定了html文档一节的开始和结束部分,如何获得它们之间的所有内容

2024-06-16 11:02:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一些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中任意两个元素之间的树的所有部分,我希望能够以各种方式操作它们。在运行dir(myKeys[0])之后,我一直在使用getparent、getchildrent和所有其他方法,但是我没有取得进展。在

如有任何建议,将不胜感激


Tags: 文件方法keytextin文档文本元素
2条回答

我建议在这个任务中使用SAX。在

基本文档可从http://lxml.de/sax.html#producing-sax-events-from-an-elementtree-or-element获得

处理程序应该使用不带任何操作的事件,直到它收到需要的粗体项,然后将事件写入新的buffer/tree/anywhere,直到它收到终止的粗体项。在

本着这样的精神,我已经找到了我认为最好的答案,并将自己张贴出来。在

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的粗体部分定义了文档的不同部分。标题是包含单词“KEY”的粗体元素列表。根据我的特殊需要,我可能需要标题中任意两个项目之间的所有文本,我可以创建测试和必要的逻辑从标题中选择项目。在

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

接下来我得到完整的列表,它是树中所有的htm元素。因为LXML按照顺序构建树,我知道我想要捕获所有元素bolditems[I]和bolditems[I+1]。好在Python构建测试的方式非常简单。在

我现在可能还需要清除这两个文本之间的所有内容。在

相关问题 更多 >