使用BS4和Python提取不寻常的XML标记

时间:2016-04-01 08:05:29

标签: python xml parsing tags

无法在任何地方找到答案。 我有一个XML:

<channel>
    <title>xxx</title>
    <description>aaa</description>
    <item>
        <title>theTitle</title>
        <link/>link
        </item>
        <title>theTitle2</title>
        <link/>link
        </item>

我需要从该文件中提取所有链接。

我迭代:

for link in soup.channel.findAll('item'):
    links = link.link
    linkdict.append(links)

但输出是:

[<link/>, <link/>, <link/>]

如何使用/不使用正则表达式解析此xml。我希望代码尽可能简单。

更新

我已经找到了在一行代码中完成此操作的方法:

soup = bs4.BeautifulSoup(output, features='xml')

2 个答案:

答案 0 :(得分:0)

使用此安装Xml - pip install lxml 然后您可以使用

轻松解析
 soup = BeautifulSoup(xmlString,"lxml")

答案 1 :(得分:0)

如果您安装了BeautifulSoup,则可以直接使用 而不是lxml。在link树模型中,<link/>文本将作为相应from lxml import etree raw = '''<channel> <title>xxx</title> <description>aaa</description> <item> <title>theTitle</title> <link/>link </item> <item> <title>theTitle2</title> <link/>link </item> </channel>''' root = etree.fromstring(raw) for link in root.xpath('//item/link'): print link.tail.strip() 元素的 tail 提供:

link
link

输出

//item/link

XPath表达式item表示在当前文档中的任何位置查找link元素,并返回相应的子元素lxml 。值得一提的是,在大多数情况下,已知GET /store1/purchase/_search?q=vendor:Marie&size=1&sort=date:desc { "query": { "exists" : { "field" : "promotionCode" } } } 比BS4更快。

参考文献:
1)it's only :figwheel submap of project.clj
2)BeautifulSoup 4 Benchmark