返回webSITE链接Python Beautifulsoup

时间:2016-12-19 17:16:19

标签: python web-scraping beautifulsoup

我正在使用带有beautifulsoup(bs4)和urllib的Python 3.5。我将追加的代码返回ONE页面的所有链接。

如何循环播放此内容以使其在网站中的所有页面上运行,使用每页上的链接指定下一页要删除的页面。因为我不知道我需要去多少跳。

我当然试过循环它,但它永远不会停止,因为页面包含我已扫描的页面的链接。我已经尝试创建我已扫描的链接集,如果不在集合中......但它再次运行永远。

import bs4
import re
import urllib.request

website = 'http://elderscrolls.wikia.com/wiki/Skyrim'

req = urllib.request.Request(website)

with urllib.request.urlopen(req) as response:
    the_page = response.read()#store web page html

dSite = bs4.BeautifulSoup(the_page, "html.parser")

links = []

for link in dSite.find_all('a'):#grab all links on page
    links.append(link.get('href'))

siteOnly = re.split('/', website)

validLinks = set()

for item in links:
    if re.search('^/' +siteOnly[3] + '/', str(item)):#filter links to local website
        newLink = 'http://' + str(siteOnly[2]) + str(item)
        validLinks.add(newLink)

print(validLinks)

1 个答案:

答案 0 :(得分:0)

import bs4, requests
from urllib.parse import urljoin

base_url = 'http://elderscrolls.wikia.com/wiki/Skyrim'
response = requests.get(base_url)
soup = bs4.BeautifulSoup(response.text, 'lxml')
local_a_tags = soup.select('a[href^="/wiki/"]')
links = [a['href']for a in local_a_tags]
full_links = [urljoin(base_url, link) for link in links]
print (full_links)

出:

http://elderscrolls.wikia.com/wiki/The_Elder_Scrolls_Wiki
http://elderscrolls.wikia.com/wiki/Portal:Online
http://elderscrolls.wikia.com/wiki/Quests_(Online)
http://elderscrolls.wikia.com/wiki/Main_Quest_(Online)
http://elderscrolls.wikia.com/wiki/Aldmeri_Dominion_Quests
http://elderscrolls.wikia.com/wiki/Daggerfall_Covenant_Quests
http://elderscrolls.wikia.com/wiki/Ebonheart_Pact_Quests
http://elderscrolls.wikia.com/wiki/Category:Online:_Side_Quests
http://elderscrolls.wikia.com/wiki/Factions_(Online)
http://elderscrolls.wikia.com/wiki/Aldmeri_Dominion_(Online)
http://elderscrolls.wikia.com/wiki/Daggerfall_Covenant
http://elderscrolls.wikia.com/wiki/Ebonheart_Pact
http://elderscrolls.wikia.com/wiki/Classes_(Online)
http://elderscrolls.wikia.com/wiki/Dragonknight
http://elderscrolls.wikia.com/wiki/Sorcerer_(Online)
http://elderscrolls.wikia.com/wiki/Nightblade_(Online)
http://elderscrolls.wikia.com/wiki/Templar
http://elderscrolls.wikia.com/wiki/Races_(Online)
http://elderscrolls.wikia.com/wiki/Altmer_(Online)
http://elderscrolls.wikia.com/wiki/Argonian_(Online)
http://elderscrolls.wikia.com/wiki/Bosmer_(Online)
http://elderscrolls.wikia.com/wiki/Breton_(Online)
http://elderscrolls.wikia.com/wiki/Dunmer_(Online)
http://elderscrolls.wikia.com/wiki/Imperial_(Online)
http://elderscrolls.wikia.com/wiki/Khajiit_(Online)
http://elderscrolls.wikia.com/wiki/Nord_(Online)
http://elderscrolls.wikia.com/wiki/Orsimer_(Online)
http://elderscrolls.wikia.com/wiki/Redguard_(Online)
http://elderscrolls.wikia.com/wiki/Locations_(Online)
http://elderscrolls.wikia.com/wiki/Regions_(Online)
http://elderscrolls.wikia.com/wiki/Category:Online:_Realms
http://elderscrolls.wikia.com/wiki/Category:Online:_Cities
http://elderscrolls.wikia.com/wiki/Category:Online:_Dungeons
http://elderscrolls.wikia.com/wiki/Category:Online:_Dark_Anchors
http://elderscrolls.wikia.com/wiki/Wayshrines_(Online)
http://elderscrolls.wikia.com/wiki/Category:Online:_Unmarked_Locations
http://elderscrolls.wikia.com/wiki/Combat_(Online)
http://elderscrolls.wikia.com/wiki/Skills_(Online)
http://elderscrolls.wikia.com/wiki/Ultimate_Skills
http://elderscrolls.wikia.com/wiki/Synergy
http://elderscrolls.wikia.com/wiki/Finesse
http://elderscrolls.wikia.com/wiki/Add-ons

首先,使用请求而不是urllib。

比,使用Beautifulsoup CSS选择器可以在开始时过滤href基础,你可以参考document了解更多信息。

最后,使用urljoin将相对url转换为absoulte url

>>> from urllib.parse import urljoin
>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html')
'http://www.cwi.nl/%7Eguido/FAQ.html'