我正在使用一些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])之后的方法,但我没有取得进展。
任何建议都将不胜感激
答案 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构建测试的方式非常简单。
我现在可以获取所有这些内容的文本,虽然我仍然需要清理它,但我已经成功地删除了我可能想要的任何两个项目之间的所有文本。