【问题标题】:python - xml/html parsing problampython - xml/html 解析问题
【发布时间】:2013-03-25 00:43:00
【问题描述】:

我需要将给定的文件解析为字符串列表, 给定的文件样式是这样的:

<DOC>
<DOCNUM> NUMBER </DOCNUM>
<DOCTYPE> TYPE </DOCTYPE>
<HEADER>
&SOMETHING
</HEADER>
<BODY>
<HEADLINE>
SOME TEXT
</HEADLINE>
TEXT
TEXT 
TEXT 
<TEXT>
<P>
INPUT TEXT1
</P>
<P>
INPUT TEXT2
</P>
.
.
.
</TEXT>
</BODY>
</DOC>

我需要列出 P 标签外观内的所有 TEXTi 实例。 我尝试使用 lxml xml 解析器执行此操作,但因为 &something 在 xml 格式中是不可接受的,所以它不起作用... 我尝试使用 html 解析器,但我没有弄清楚如何让它工作。

有没有人知道我获取所需列表的好方法?

【问题讨论】:

    标签: python xml parsing lxml


    【解决方案1】:

    beautifulsoup似乎解析没有问题。

    >>> from bs4 import BeautifulSoup as BS
    >>> from itertools import chain
    
    >>> doc = BS('''<DOC>
    <DOCNUM> NUMBER </DOCNUM>
    <DOCTYPE> TYPE </DOCTYPE>
    <HEADER>
    &SOMETHING
    </HEADER>
    <BODY>
    <HEADLINE>
    SOME TEXT
    </HEADLINE>
    TEXT
    TEXT 
    TEXT 
    <TEXT>
    <P>
    
    INPUT TEXT1
    </P>
    <P>
    INPUT TEXT2
    </P>
    .
    .
    .
    </TEXT>
    </BODY>
    </DOC>''')
    
    >>> list(chain(*[list(p.stripped_strings) for p in doc.find_all('p')]))
    [u'INPUT TEXT1', u'INPUT TEXT2']
    

    【讨论】:

      【解决方案2】:

      您可以使用模块re 导入正则表达式函数:

      import re
      strr="<DOC> <DOCNUM> NUMBER </DOCNUM> <DOCTYPE> TYPE </DOCTYPE> <HEADER> &SOMETHING </HEADER> <BODY> <HEADLINE> SOME TEXT </HEADLINE> TEXT TEXT  TEXT  <TEXT> <P> INPUT TEXT1 </P> <P> INPUT TEXT2 </P> . . . </TEXT> </BODY> </DOC>"
      
      arr = re.findall(r'<P>.*?</P>', strr)
      print arr
      

      如果您没有嵌套的 &lt;P&gt; 标签,这将起作用(但是,任何其他标签都可以在 &lt;P&gt; 标签中)

      【讨论】:

        【解决方案3】:

        您可以使用recover=True 选项忽略&lt;HEADER&gt; 中的&amp;

        from lxml import etree
        
        doc = etree.parse(xmlish_file, parser=etree.XMLParser(recover=True))
        print([p.text for p in doc.iter('P')])
        # -> ['\nINPUT TEXT1\n', '\nINPUT TEXT2\n']
        

        或者您可以将其解析为 html。如果你对&lt;p&gt;里面的所有文字感兴趣;你可以使用.text_content() 而不是.text

        from lxml import html
        
        doc = html.parse(xmlish_file)
        print([p.text_content() for p in doc.iter('p')])
        # -> ['\nINPUT TEXT1\n', '\nINPUT TEXT2\n']
        

        【讨论】:

          猜你喜欢
          • 2011-09-05
          • 1970-01-01
          • 2011-10-17
          • 2020-04-15
          • 1970-01-01
          • 2017-10-09
          • 2012-08-01
          • 1970-01-01
          相关资源
          最近更新 更多