2017-09-01 21 views
0

我目前在coursera上學習Python專業。我遇到了使用BeautifulSoup從網頁中提取特定鏈接的問題。在這個網頁(http://py4e-data.dr-chuck.net/known_by_Fikret.html)中,我應該從用戶輸入中提取一個URL並打開後續鏈接,所有後續鏈接都通過錨定標籤標識並運行一些迭代。在Python 3.0中使用Beautiful Soup獲取特定鏈接的最有效方法是什麼?

雖然我能夠使用列表對它們進行編程,但我想知道是否有沒有使用列表或字典的簡單方法?

html = urllib.request.urlopen(url, context=ctx).read() 
    soup = BeautifulSoup(html, 'html.parser') 
    tags = soup('a') 
    nameList=list() 
    loc='' 
    count=0 
    for tag in tags: 
     loc=tag.get('href',None) 
     nameList.append(loc) 
    url=nameList[pos-1] 

在上面的代碼,你會發現,使用「A」標記和「href」屬性定位的鏈接之後,我不能幫助,但必須創建一個名爲名稱列表來定位鏈接的位置列表。由於這是低效的,我想知道我是否可以直接找到URL而不使用列表。提前致謝!

回答

3

最簡單的方法是讓一個元素了tags列表和然後提取物href值:

tags = soup('a') 
a = tags[pos-1] 
loc = a.get('href', None) 

您還可以使用soup.select_one()方法查詢:nth-of-type元素:

soup.select('a:nth-of-type({})'.format(pos)) 

由於:nth-of-type使用基於1的索引,如果您的用戶不需要從pos減去1預計也會使用基於1的索引。


注意湯的:nth-of-type不等同於CSS :nth-of-type僞類,因爲它總是隻選擇一個元素,而CSS選擇器可以一次選擇多個元素。


如果你要尋找的 「最有效的方式」,那麼你需要看看lxml

from lxml.html import fromstring 
tree = fromstring(r.content) 
url = tree.xpath('(//a)[{}]/@href'.format(pos))[0] 
+0

@ skovorodkin謝謝! – aspiringroboticist

相關問題