带有下划线的标签会导致BeautifulSoup选择器失败

时间:2014-04-21 23:29:33

标签: python-2.7 beautifulsoup

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?

1 个答案:

答案 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适用于代码,如上所示。

无论如何,请告诉我们这是否有效。