2017-03-02 54 views
0

我試圖從一個HTML列表湊一些的HREF刮,一些源代碼如下:Python從變量的類屬性

<ul class="sub-menu"> 
    <li id="menu-item-4019" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4019"><a href="http://www.universalstudentliving.com/properties/belfast/">Belfast</a></li> 
    <li id="menu-item-186" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-186"><a href="http://www.universalstudentliving.com/properties/birmingham/">Birmingham</a></li> 
    <li id="menu-item-184" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-184"><a href="http://www.universalstudentliving.com/properties/canterbury/">Canterbury</a></li> 
    <li id="menu-item-4544" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4544"><a href="http://www.universalstudentliving.com/properties/the-clink-durham/">Durham</a></li> 
</ul> 

我曾嘗試使用下面的代碼來獲取HREF嘗試:

for ul in soup.find_all(class_="sub-menu"): 
    for the_href in ul.find_all(class_="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4542"): 
     print(the_href.a.get('href')) 

但是我後來意識到class_="menu-item menu-item-type-post_type menu-item-object-properties menu-item-xxxx的最後一位,即應該代替xxxx的數字,對於每個列表項都是不同的。

所以我有2個問題真:

1)給定的源代碼,這是最有效的方式來獲得的HREFs?

2)如果是,或者僅僅是爲了一般的知識,我將如何去獲取它們,因爲類屬性末尾的最後幾位數發生了變化?

對不起,如果這是重複的,我似乎無法找到它如此。

回答

1

我不知道你的真實HTML是否比你在問題中提供的HTML更復雜,但爲什麼要混淆類,而不是隻使用標籤元素名稱來獲得你想要的結果?

一般來說,你應該爲了使用一些類的名字,甚至更好一些IDS(這是唯一的),以減少HTML來,你是在有趣的真正領域。

但實際代碼那是不可思議的:

from bs4 import BeautifulSoup as Soup 
html_str = """ 
<ul class="sub-menu"> 
    <li id="menu-item-4019" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4019"> 
     <a href="http://www.universalstudentliving.com/properties/belfast/">Belfast</a> 
    </li> 
    <li id="menu-item-186" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-186"> 
     <a href="http://www.universalstudentliving.com/properties/birmingham/">Birmingham</a> 
    </li> 
    <li id="menu-item-184" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-184"> 
     <a href="http://www.universalstudentliving.com/properties/canterbury/">Canterbury</a> 
    </li> 
    <li id="menu-item-4544" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4544"> 
     <a href="http://www.universalstudentliving.com/properties/the-clink-durham/">Durham</a> 
    </li> 
</ul>""" 
soup = Soup(html_str, 'html.parser') 
for ul in soup.find_all('ul'): 
    for the_href in ul.find_all('li'): 
     print(the_href.a.get('href')) 
+0

謝謝你。這是我最初嘗試的,但它從網頁上的所有各種列表中獲取所有鏈接! – Maverick

3

在這種特殊情況下,您可以在使用find_all時使用正則表達式。

實施例:

import re 
from bs4 import BeautifulSoup 

example = """<ul class="sub-menu"> 
<li id="menu-item-4019" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4019"><a href="http://www.universalstudentliving.com/properties/belfast/">Belfast</a></li> 
<li id="menu-item-186" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-186"><a href="http://www.universalstudentliving.com/properties/birmingham/">Birmingham</a></li> 
<li id="menu-item-184" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-184"><a href="http://www.universalstudentliving.com/properties/canterbury/">Canterbury</a></li> 
<li id="menu-item-4544" class="menu-item menu-item-type-post_type menu-item-object-properties menu-item-4544"><a href="http://www.universalstudentliving.com/properties/the-clink-durham/">Durham</a></li> 
</ul>""" 

soup = BeautifulSoup(example, "html.parser") 

for o in soup.find_all('li', class_=re.compile(r'menu-item menu-item-type- 
post_type menu-item-object-properties menu-item-')): 
    print (o.a["href"]) 

輸出

http://www.universalstudentliving.com/properties/belfast/ http://www.universalstudentliving.com/properties/birmingham/ http://www.universalstudentliving.com/properties/canterbury/ http://www.universalstudentliving.com/properties/the-clink-durham/