如何在BeautifulSoup中获得所需的值?

时间:2019-08-16 10:45:59

标签: python beautifulsoup

假设我们的html代码如下:

html = '<div class="dt name">abc</div><div class="name">xyz</div>'
soup = BeautifulSoup(html, 'lxml')

我想获得名字xyz。然后,我写

soup.find('div',{'class':'name'})

但是,它返回abc

如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

blog可以帮助您完成所需的工作,即明确查找具有特定类属性的标签:

from bs4 import BeautifulSoup

html = '<div class="dt name">abc</div><div class="name">xyz</div>'
soup = BeautifulSoup(html, 'html.parser')

soup.find(lambda tag: tag.name == 'div' and tag['class'] == ['name'])

输出:

<div class="name">xyz</div>

答案 1 :(得分:1)

您可以在没有lambda的情况下使用select来查找确切的类名,如下所示:

soup.select("div[class = name]")

会给:

[<div class="name">xyz</div>]

如果您希望标签之间的值是

soup.select("div[class=name]")[0].get_text()

会给:

xyz

如果您将{strong> multiple divclass = 'name'一起使用,则可以执行以下操作:

for i in range(len(soup.select("div[class=name]"))):
    print(soup.select("div[class=name]")[i].get_text())


参考https://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors

答案 2 :(得分:1)

这可能对您有用,请注意,它取决于div是html中的第二个div项。

import requests
from bs4 import BeautifulSoup

html = '<div class="dt name">abc</div><div class="name">xyz</div>'

soup = BeautifulSoup(html, features='lxml')

print(soup('div')[1].text)

答案 3 :(得分:1)

问题在于,Beautiful Soup返回具有类namediv的第一个元素,因此,问题在于,第一个div具有类name和类dt因此它选择了该div。

因此,div有所帮助,但仍缩小到2个div。接下来,它返回一个数组,因此检查第二个div以使用print(soup('div')[1].text)。如果要打印所有div,请使用以下代码:

for i in range(len(soup('div')))
    print(soup('div')[i].text)

正如Ankur Sinha的答案中指出的那样,如果要选择仅具有类div的所有name,则必须使用select,如下所示:< / p>

soup.select('div[class=name]')[0].get_text()

但是,如果有多个div满足此属性,请使用以下命令:

for i in range(len(soup.select('div[class=name]'))):
    print(soup.select('div[class=name]')[i].get_text())

只要继续使用Ankur Sinha,当您使用select或什至只使用soup()时,它就会形成一个数组,这就是为什么我使用len()来确定数组的长度。然后,我在其上运行了for循环,然后从0开始在select上打印了i函数。

这样做时,它会给出一个特定的div而不是一个数组,如果给出了一个数组,则调用get_text()会产生错误,因为该数组是 NOT < / em>文本。