我试图从div类中提取页面数(在本例中为156)。代码如下所示。
<div class="listing-count-label listing-count-holder listing-count-holder-header">8007 listings, showing 1 to 156</div>
我目前有:
page = soup.find("div",{"class":"listing-count-label listing-count-holder listing-count-holder-header"})
for x in page:
print (x.text)
产量:
[]
最终我想要页面= 156。
答案 0 :(得分:2)
问题是,find()
返回单个元素(一个Tag
实例),它也可以可迭代 - 你会迭代元素的孩子。而且,由于只有一个孩子 - 一个文本节点,@ Dekel的答案才有效。
但是,你真的不需要for
循环,可以直接获取文字:
page = soup.find("div", {"class":"listing-count-label listing-count-holder listing-count-holder-header"})
print(page.get_text())
此外,您并不需要列出元素的所有类来定位它,您可以使用单个类:
soup.find("div", class_="listing-count-label")
或者,使用CSS selector:
soup.select_one("div.listing-count-label")
但是,由于您完成了页数,为什么我们不使用regular expression通过文本找到元素 - 并且,我们将使用相同的正则表达式来提取页数:
>>> import re
>>> from bs4 import BeautifulSoup
>>>
>>> data = """<div class="listing-count-label listing-count-holder listing-count-holder-header">8007 listings, showing 1 to 156</div>"""
>>>
>>> pattern = re.compile(r"\d+ listings, showing \d+ to (\d+)")
>>>
>>> soup = BeautifulSoup(data, "html.parser")
>>>
>>> pattern.search(soup.find(text=pattern)).group(1)
u'156'
并且,您可以使用int()
将其转换为整数。但是,这段代码缺少错误处理 - 事情可能会出错 - 确保妥善处理错误。
答案 1 :(得分:1)
示例中的变量x
为NavigableString
object,其中没有text
属性。您唯一需要做的就是使用此x
或将其转换为string
(使用str(x)
):
>>> page = soup.find("div",{"class":"listing-count-label listing-count-holder listing-count-holder-header"})
>>> for x in page:
... print (x)
8007 listings, showing 1 to 156
答案 2 :(得分:1)
find
方法将找到一个标记对象。不要使用for
语法,只需编写page.text
。
答案 3 :(得分:1)
number = soup.find('div', class_='listing-count-label').text.split()[-1]
text: 8007 listings, showing 1 to 156
split_text :['8007', 'listings,', 'showing', '1', 'to', '156']
首先,find()
将返回一个标记,因此您无法对其进行迭代,该数字位于代码的文本中,因此您可以使用.text
获取文本并按空格分割,并获取拆分列表的最后一个元素。
其次,你可以使用class属性的一部分来过滤标签,不需要使用整个属性。
请记住,单个标记的“类”可以有多个值 属性。当您搜索与某个CSS类匹配的标记时, 你匹配任何CSS类:
css_soup = BeautifulSoup('<p class="body strikeout"></p>') css_soup.find_all("p", class_="strikeout") # [<p class="body strikeout"></p>] css_soup.find_all("p", class_="body") # [<p class="body strikeout"></p>]