假设我们的html代码如下:
html = '<div class="dt name">abc</div><div class="name">xyz</div>'
soup = BeautifulSoup(html, 'lxml')
我想获得名字xyz
。然后,我写
soup.find('div',{'class':'name'})
但是,它返回abc
。
如何解决这个问题?
答案 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 div
与class = 'name'
一起使用,则可以执行以下操作:
for i in range(len(soup.select("div[class=name]"))):
print(soup.select("div[class=name]")[i].get_text())
答案 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返回具有类name
和div
的第一个元素,因此,问题在于,第一个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>文本。