XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<sites>
<site>
<name>Default</name>
<url_namespace>default</url_namespace>
</site>
</sites>
汤信息:
soup = BeautifulSoup(xml)
soup.select('url_namespace')
错误:
ValueError: Unsupported or invalid CSS selector: "url_namespace"
如何选择xml标记,或者包含下划线的id?
答案 0 :(得分:1)
我建议使用lxml只是因为这可以通过一个简单的XPath完成,但只是为了显示如何选择一个无效的CSS选择器......好吧,你实际上并没有。有几件事情可以做,其中一件事就是用一个特定类的div
标签替换攻击性标签,这样你就可以选择它。
但是,真正快速执行此操作的方法是更改您找到的每个元素的name
属性。
from bs4 import BeautifulSoup as bsoup
data = """
<?xml version='1.0' encoding='UTF-8'?>
<sites>
<site>
<name>Default</name>
<url_namespace>default1</url_namespace>
<url_namespace>default2</url_namespace>
<url_namespace>default3</url_namespace>
<url_namespace>default4</url_namespace>
</site>
</sites>
"""
soup = bsoup(data)
elements = soup.find_all("url_namespace")
for element in elements:
element.name = "urlnamespace"
print soup
以上将汤改为:
<html><body><sites>
<site>
<name>Default</name>
<urlnamespace>default1</urlnamespace>
<urlnamespace>default2</urlnamespace>
<urlnamespace>default3</urlnamespace>
<urlnamespace>default4</urlnamespace>
</site>
</sites>
</body></html>
将以下代码块添加到上面的代码中......
targets = soup.select("urlnamespace")
for target in targets:
print target.get_text()
...给你以下结果:
default1
default2
default3
default4
不是最漂亮的方式,但它确实有效。然而,出于纯粹的好奇心,为什么需要以这种方式选择标签? find_all
适用于代码,如上所示。
无论如何,请告诉我们这是否有效。