【问题标题】:Parsing non-standard XML (CDATA tag)解析非标准 XML(CDATA 标记)
【发布时间】:2011-12-08 19:22:26
【问题描述】:

当我想使用 BeautifulSoup 库在 Python 中解析 XML 文档时, 我遇到了一些问题。我要解析的 XML 文档:

<item>
<title><![CDATA[Title Sample]]></title>
<link /><![CDATA[http://banhada.kr/?cateCode=09&viewCode=S0941580]]>
<time_start>2011-10-10 09:00:00</time_start>
<time_end>2011-10-17 09:00:00</time_end>
<price_original>35000</price_original>
<price_now>20000</price_now>
</item>

正如你在上面看到的,标签有点奇怪。在我看来,that(tag) 不是一个标准的 XML 形式,对吧?如何解析这种可怕的形式?

【问题讨论】:

    标签: python xml beautifulsoup


    【解决方案1】:

    您不需要 BeautifulStoneSoup 或 lxml。 Python 附带的电池可以很好地完成这项工作,而且您的 XML 似乎没有任何不合规的地方。

    >>> content='''\
    ... <item>
    ... <title><![CDATA[Title Sample]]></title>
    ... <link /><![CDATA[http://banhada.kr/?cateCode=09&viewCode=S0941580]]>
    ... <time_start>2011-10-10 09:00:00</time_start>
    ... <time_end>2011-10-17 09:00:00</time_end>
    ... <price_original>35000</price_original>
    ... <price_now>20000</price_now>
    ... </item>'''
    >>> import xml.etree.cElementTree as et
    >>> foo = et.XML(content)
    >>> for e in foo:
    ...     print e.tag, e.text, repr(e.tail)
    ...
    title Title Sample '\n'
    link None 'http://banhada.kr/?cateCode=09&viewCode=S0941580\n'
    time_start 2011-10-10 09:00:00 '\n'
    time_end 2011-10-17 09:00:00 '\n'
    price_original 35000 '\n'
    price_now 20000 '\n'
    >>>
    

    【讨论】:

    • 这在 BeautifulSoup 无法处理的 XML 上对我有用!
    【解决方案2】:

    您可以使用BeautifulSoup 来解析 XML:

    import bs4 as bs
    content='''\
    <item>
    <title><![CDATA[Title Sample]]></title>
    <link /><![CDATA[http://banhada.kr/?cateCode=09&viewCode=S0941580]]>
    <time_start>2011-10-10 09:00:00</time_start>
    <time_end>2011-10-17 09:00:00</time_end>
    <price_original>35000</price_original>
    <price_now>20000</price_now>
    </item>'''    
    
    soup = bs.BeautifulSoup(content, 'xml')
    
    title = soup.title
    print(title.string)
    # Title Sample
    
    link = soup.link.nextSibling
    print(link)
    # http://banhada.kr/?cateCode=09&viewCode=S0941580
    

    在后台,BeautifulSoup 使用 lxml 来解析 XML。 虽然这里不需要,但您可能希望直接使用 lxml,因为它为您提供了使用 XPath 浏览 XML 的更简洁的方法:

    import lxml.etree as ET
    
    content='''\
    <item>
    <title><![CDATA[Title Sample]]></title>
    <link /><![CDATA[http://banhada.kr/?cateCode=09&viewCode=S0941580]]>
    <time_start>2011-10-10 09:00:00</time_start>
    <time_end>2011-10-17 09:00:00</time_end>
    <price_original>35000</price_original>
    <price_now>20000</price_now>
    </item>'''    
    
    doc = ET.fromstring(content)
    
    title = doc.find('title')
    print(title.text)
    # Title Sample
    
    link = doc.find('link')
    print(link.tail)
    # http://banhada.kr/?cateCode=09&viewCode=S0941580
    

    【讨论】:

    • 哇。谢谢你的善意
    • 用户警告:BeautifulStoneSoup 类已弃用。不要使用它,而是将 features="xml" 传递给 BeautifulSoup 构造函数。
    • 更新了我的答案以使用 BeautifulSoup4。
    猜你喜欢
    • 2013-11-25
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多