【问题标题】:Extract text and (hlStart and hlEnd) tags from simple html从简单的 html 中提取文本和(hlStart 和 hlEnd)标签
【发布时间】:2020-08-25 09:37:14
【问题描述】:

我有以下部分的 html/xml 文件:

<p><hlstart ana="#ann224094"></<hlstart>Przed<hlend ana="#ann224094"></hlend> <hlstart ana="#ann224160"></hlstart>nami <hlend ana="#ann224160"></hlend>jeszcze trzy <hlstart ana="#ann224159"></hlstart>dni,<hlend ana="#ann224159"></hlend></p>

我想提取文本和标签以将它们排列在表格中,例如:

text, nonana
text, ana

其中ana表示标签,例如来自

的#ann224094
<hlstart ana="#ann224094"></<hlstart>Przed<hlend ana="#ann224094"></hlend> 

nonana 表示文本没有 ana 标签。

przed, #ann224094
nami, #ann224160
jeszcze trzy, nonana

我用我的 xml 数据的其他部分尝试了 bs4 和 htmlparser,但我不明白那部分。我可以使用 .text 方法导出整个文本,所有字符串,但我需要知道哪些单词有 ana 标签。此外,所有带有 ana 标签的单词在我的文件后面都有特定的标签。

【问题讨论】:

    标签: python r xml-parsing html-parsing tei


    【解决方案1】:
    from bs4 import BeautifulSoup
    
    txt = '''<p><hlstart ana="#ann224094"></hlstart>Przed<hlend ana="#ann224094"></hlend> <hlstart ana="#ann224160"></hlstart>nami <hlend ana="#ann224160"></hlend>jeszcze trzy <hlstart ana="#ann224159"></hlstart>dni,<hlend ana="#ann224159"></hlend></p>'''
    
    soup = BeautifulSoup(txt, 'html.parser')
    
    out = []
    for t in soup.find_all(text=True):
        if t.strip() == '':
            continue
    
        prev = t.find_previous_sibling()
        if prev.name == 'hlstart':
            out.append( (t, prev['ana']) )
        else:
            out.append( (t, 'noana') )
    
    # print it to screen:
    from pprint import pprint
    pprint(out)
    

    打印:

    [('Przed', '#ann224094'),
     ('nami ', '#ann224160'),
     ('jeszcze trzy ', 'noana'),
     ('dni,', '#ann224159')]
    

    【讨论】:

      【解决方案2】:

      另一种方法,使用lxml:

          ana = """your html above"""
          import lxml.html as lh
      
          doc = lh.fromstring(ana)
          targets = doc.xpath('//hlstart[@ana]')
          nont = doc.xpath('//*[name() != "hlstart"]')
      
          for target in targets:
              if target.tail is not None:
                  print(target.attrib['ana'],target.tail.strip())
      
          for n in nont:
              if n.tail is not None and len(n.tail.strip())>0:
                 print('noanna ',n.tail.strip())
      

      输出:

      #ann224094 Przed
      #ann224160 nami
      #ann224159 dni,
      noanna  jeszcze trzy
      

      【讨论】:

        【解决方案3】:

        另一种方法,使用 SimplifiedDoc :)

        from simplified_scrapy import SimplifiedDoc,utils
        html = '''
        <p>
        <hlstart ana="#ann224094"></hlstart>Przed<hlend ana="#ann224094"></hlend> 
        <hlstart ana="#ann224160"></hlstart>nami <hlend ana="#ann224160"></hlend>
        jeszcze trzy 
        <hlstart ana="#ann224159"></hlstart>dni,<hlend ana="#ann224159"></hlend></p>'''
        
        doc = SimplifiedDoc(html)
        for h in doc.p.hlstarts:
            text = h.nextText()
            if text: print(h.ana,text)
        for h in doc.p.hlends:
            text = h.nextText()
            if text: print('noana',text)
        

        结果:

        #ann224094 Przed
        #ann224160 nami
        #ann224159 dni,
        noana jeszcze trzy
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-05-05
          • 1970-01-01
          • 2021-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多