我有一个这样的html文件:
<html>
<head></head>
<body>
<p>
<dfn>Definition</dfn>sometext / ''
(<i>othertext</i>)someothertext / ''
(<i>...</i>)
(<i>...</i>)
</p>
<p>
<dfn>Definition2</dfn>sometext / ''
(<i>othertext</i>)someothertext / ''
<i>blabla</i>
<i>bubu</i>
</p>
</body>
</html>
sometext /''表示dfn标签后面可能有或不可能是某些文本,i标签也是如此。另外,我在其中的标签和文字并不总是存在。只有dfn标签内的文字一直存在。
我需要为每个p标签获取以下输出:
定义,某些文本,其他文本,某些文本。
定义2,sometext,othertext,someothertext,blabla,bubu。
我尝试使用以下代码实现它:
tree = etree.parse(filename)
places = []
for dfn in tree.getiterator('dfn'):
def_text = dfn.text
def_tail = dfn.tail
for sibling in dfn.itersiblings():
sib_text = sibling.text
sib_tail = sibling.tail
if def_text not in places:
places.append(def_text)
if def_tail == None or sib_text == None or sib_tail == None:
continue
else:
places.append(def_tail), places.append(sib_text), places.append(sib_tail)
return places
这给了我一半正确的输出。例如,它只是跳过此表单的条目:
<p><dfn>Cityname</dfn>, text 2349 </p>
或者我从i-tag及其标签部分获取文本... 我想问题是关于迭代,但我真的找不到错误......
有没有有效的方法来实现我的目标?
P.S。我也用 tree.xpath('// p / text()')尝试了一些东西,但是它太笼统了,在我的情况下,我需要提取dfn的兄弟姐妹关于dfn本身的文本:如果dfn好(我有更多的代码来定义dfn是否合适),然后打印出dfn以及p标签内随附的所有文本。
答案 0 :(得分:0)
我会尝试以下内容:
for p in tree.xpath("//p"): # This gets all the p elements
dfn = p.xpath('./dfn')[0] # may want to check this exists first
after_dfn = p.xpath("./dfn/following-sibling::node()")
for x in after_dfn:
pass # do whatever you need to do with the stuff after dfn
答案 1 :(得分:0)
谢谢你的暗示,我有这个给了我很满意的东西:
for p in tree.xpath("//p"):
dfn = p.xpath('./dfn/text()')
after_dfn = p.xpath("./dfn/following::text()")
if dfn!=None:
print dfn
if after_dfn !=None:
for x in after_dfn:
print x
唯一的问题是 - 它导致无限循环,我怎么能摆脱它呢?