如何使用lxml解析从html文件中打印出所有文本信息?

时间:2014-02-10 15:55:49

标签: python parsing iteration output lxml

我有一个这样的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标签内随附的所有文本。

2 个答案:

答案 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

唯一的问题是 - 它导致无限循环,我怎么能摆脱它呢?