for循环与.find()

b5buobof  于 2021-09-08  发布在  Java
关注(0)|答案(2)|浏览(306)

我是编程新手,我已经通过freecodecamp学习了几个星期。我正在查看他们网站上的代码,我有两个问题。
为什么需要洗牌变量alllinks?
什么是 if link ['href'].find("/wiki/") == -1 真的要检查吗?
我真的很感谢你的帮助。

import requests
from bs4 import BeautifulSoup
import random

response = requests.get(
    url="https://en.wikipedia.org/wiki/Web_scraping",
)
soup = BeautifulSoup(response.content, 'html.parser')

title = soup.find(id="firstHeading")
print(title.content)

# Get all the links

allLinks = soup.find(id="bodyContent").find_all("a")
random.shuffle(allLinks)   
linkToScrape = 0

for link in allLinks:
    # We are only interested in other wiki articles
    if link['href'].find("/wiki/") == -1: 
        continue

    # Use this link to scrape
    linkToScrape = link
    break

print(linkToScrape)

以下是输出:

<a href="/wiki/Eventbrite" title="Eventbrite">Eventbrite, Inc.</a>
sc4hvdpw

sc4hvdpw1#

最好先解释问题2并描述代码的作用。
回想一下,find()返回子字符串第一次出现的索引,如果找不到所需的子字符串,则返回-1。所以 if link ['href'].find("/wiki/") == -1 检查是否在字符串中找到子字符串“/wiki/” link ['href'] . 它执行 continue 如果引用链接不包含“/wiki/”。因此,循环将继续遍历链接,直到找到包含/wiki/的链接或遍历所有链接。因此,循环结束时linktoscrape的值将是包含/wiki/的第一个链接,如果没有链接包含它,则为0。
现在,对于第一个问题,为了让代码完成它所做的工作,需要进行随机洗牌,即打印一篇链接在文章中的随机wikipidia文章https://en.wikipedia.org/wiki/web_scraping. 如果没有洗牌,代码将始终打印文章中链接的第一篇wiki文章https://en.wikipedia.org/wiki/web_scraping.
注意:评论中表达的意图是只查找wiki文章,但要查找诸如https://google.com/wiki/ 也将被打印,而不是维基文章。

p1iqtdky

p1iqtdky2#

您可以阅读以下文档: .find() 在这里:https://docs.python.org/3/library/stdtypes.html#str.find
基本上, haystack.find(needle) == -1 这是一种迂回的说法 needle not in haystack .
打电话的意义 random.shuffle() 这段代码的作者显然想随机从页面中选择一个链接,而不是使用第一个或最后一个。

相关问题