使用 BS4 和 Python 提取不寻常的 XML 标签
Extract an unusual XML tag with BS4 and Python
无法在任何地方找到答案。
我有一个 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 with/without。我希望代码尽可能简单。
更新
我找到了用一行代码完成它的方法:
soup = bs4.BeautifulSoup(output, features='xml')
使用此安装 Xml - pip install lxml
然后您可以使用
轻松解析
soup = BeautifulSoup(xmlString,"lxml")
鉴于您已经安装了 lxml
,您可以直接 使用它,而不是通过 BeautifulSoup
。在 lxml
树模型中,link
文本将作为相应 <link/>
元素的 tail 可用:
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()
输出:
link
link
XPath表达式//item/link
表示查找item
元素,在当前文档的任意位置,以及return对应的子元素link
.还值得一提的是,lxml
在大多数情况下比 BS4 更快。
参考资料:
1) BeautifulSoup 4 Benchmark
2) Parsing HTML in python - lxml or BeautifulSoup? Which of these is better for what kinds of purposes?
无法在任何地方找到答案。 我有一个 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 with/without。我希望代码尽可能简单。
更新
我找到了用一行代码完成它的方法:
soup = bs4.BeautifulSoup(output, features='xml')
使用此安装 Xml - pip install lxml
然后您可以使用
soup = BeautifulSoup(xmlString,"lxml")
鉴于您已经安装了 lxml
,您可以直接 使用它,而不是通过 BeautifulSoup
。在 lxml
树模型中,link
文本将作为相应 <link/>
元素的 tail 可用:
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()
输出:
link
link
XPath表达式//item/link
表示查找item
元素,在当前文档的任意位置,以及return对应的子元素link
.还值得一提的是,lxml
在大多数情况下比 BS4 更快。
参考资料:
1) BeautifulSoup 4 Benchmark
2) Parsing HTML in python - lxml or BeautifulSoup? Which of these is better for what kinds of purposes?