2017-01-02 30 views
1

我想從div類中提取頁數(在本例中爲156)。代碼如下所示。使用BeautifulSoup提取div內的頁面信息

<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

'x.text.split(」「)[ - 1]'會給你的網頁沒有。 – user902384

回答

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

可變在你的例子中是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 
1

find方法會找到一個標籤對象。而不是使用for語法,只需編寫page.text

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>]