如何在BeautifulSoup的for循环中使用.fund正确过滤链接



我是编程新手,所以我试图从简单开始。我想制作一个网络抓取器,当提供一个维基百科网站时,它会存储该页面中链接的每一篇文章的标题和第一段。Im在开始的地方,我想选择链接并过滤那些带有"的链接/wiki/";在他们身上。以下是我到目前为止所掌握的,如果它是错误的,很抱歉:

import requests
from bs4 import BeautifulSoup

def scrapeWikiArticle(url):
response = requests.get(
url=url,
)
soup = BeautifulSoup(response.content, 'html.parser')
title = soup.find(id="firstHeading")
#first print selected subject
print(title.text)
allLinks = soup.find(id="bodyContent").find_all("a")
allLinks_len = len(allLinks)
for link in allLinks:
# We are only interested in other wiki articles
if link['href'].find("/wiki/") == -1:
for i in range(allLinks_len):
print(allLinks[i])
break
scrapeWikiArticle("https://en.wikipedia.org/wiki/Web_scraping")

我的输出包括没有/wiki的href,所以这不起作用。我还认为range属性是错误的,因为在只选择其中包含/wiki/的链接后,allLinks_len将更长。

在我看来,if link['href'].find("/wiki/") == -1:应该进入for i in range(allLinks_len):循环,但这给了我:

if link['href'].find("/wiki/") == -1:
TypeError: 'int' object is not subscriptable

很可能我完全是从错误的角度出发的。非常感谢任何指导。这是我关于堆栈溢出的第一个问题,我希望它写得好。欢迎建设性的批评。

这就是你想要的吗?

import requests
from bs4 import BeautifulSoup

def scrape_wiki_articles(url):
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
title = soup.find(id="firstHeading")
print(title.text)
for link in soup.find(id="bodyContent").find_all("a"):
if "/wiki/" not in link['href']:
print(link['href'])

scrape_wiki_articles("https://en.wikipedia.org/wiki/Web_scraping")

输出:

#cite_ref-1
http://www.searchenginehistory.com/
#cite_ref-2
https://pdfs.semanticscholar.org/4fb4/3c5a212df751e84c3b2f8d29fabfe56c3616.pdf
#cite_ref-3
http://www.gooseeker.com/en/node/knowledgebase/freeformat
#cite_ref-4
http://www.xconomy.com/san-francisco/2012/07/25/diffbot-is-using-computer-vision-to-reinvent-the-semantic-web/
#cite_ref-5
https://web.archive.org/web/20020308222536/http://www.chillingeffects.org/linking/faq.cgi#QID596
http://www.chillingeffects.org/linking/faq.cgi#QID596
and so on...

输出:

最新更新