使用BeautifulSoup在div中提取页面信息

时间:2017-01-02 01:03:04

标签: python beautifulsoup

我试图从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。

4 个答案:

答案 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)

示例中的变量xNavigableString 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>]