【问题标题】:Attempting to webscrape data but my for/in loop (using python) will not iterate through...why does it not iterate?尝试 webscrape 数据,但我的 for/in 循环(使用 python)不会迭代......为什么它不迭代?
【发布时间】:2019-06-21 12:07:39
【问题描述】:

我的 for/in 循环似乎没有请求每个 url 的 html 页面。相反,我的循环只选择最后一个 url 去获取。

我在互联网上环顾四周,正在使用人们建议的 for/in 循环,但由于某种原因它不起作用,我不知道修复方法是什么。

# Beautiful Soup Functions
import requests
from bs4 import BeautifulSoup

#url's to goto
base_url = 'https://www.espn.com/soccer/league/_/name/'
url_list = ['esp.1','ita.1','eng.1']

#url loop   
for url in url_list:
    print(base_url+url)
    r = requests.get(base_url+url)
    soup = BeautifulSoup(r.text, 'lxml')
print(soup.title.string)

#loop through standings table and pull data

预期结果是 for/in 循环将转到每个 url 并拉回 html 代码,然后我可以执行我的其他代码(循环通过排名)来拉回每个 html 页面上的表格。但是,for/in 循环不会迭代。它只是拉回最后一个连接项目的 html 页面,因此,eng.1。我真的不明白为什么 print (base_url+url) 会打印出所有 3 个连接的 url;但是 print(soup.title.string) 只表示请求了一个 url?

【问题讨论】:

  • 您的 print(soup.title.string) 在 for 循环完成后发生。每次获得新 url 时,变量 soup 都会被覆盖。您需要在 for 循环 before 和 for 循环内创建一个空列表 empty_list.append(soup)。然后,您可以处理 for 循环之外的所有结果,因为它们将包含在列表中。
  • 在 python 中,缩进很重要。直到 循环运行后,您才执行 print,因此您只能看到来自 soup.title.stringlast 值。缩进该行,使其与上面的行保持一致。

标签: python web-scraping web-crawler


【解决方案1】:

见下文(工作代码)

# Beautiful Soup Functions
import requests
from bs4 import BeautifulSoup

#url's to goto
base_url = 'https://www.espn.com/soccer/league/_/name/'
url_list = ['esp.1','ita.1','eng.1']

data = {}
for url in url_list:
    print(base_url+url)
    r = requests.get(base_url+url)
    soup = BeautifulSoup(r.text, 'lxml')
    print(soup.title.string)
    data[base_url+url] = soup

# now you can work with 'data'

输出

https://www.espn.com/soccer/league/_/name/esp.1
Spanish Primera División News, Stats, Scores  - ESPN
https://www.espn.com/soccer/league/_/name/ita.1
Italian Serie A News, Stats, Scores  - ESPN
https://www.espn.com/soccer/league/_/name/eng.1
English Premier League News, Stats, Scores  - ESPN

【讨论】:

    【解决方案2】:

    您可以创建空列表并可以在 for 循环中添加您想要的内容

    import requests
    from bs4 import BeautifulSoup
    
    #url's to goto
    base_url = 'https://www.espn.com/soccer/league/_/name/'
    url_list = ['esp.1','ita.1','eng.1']
    titles=[]
    html_sources = []
    #url loop
    for url in url_list:
        print(base_url+url)
        r = requests.get(base_url+url)
        soup = BeautifulSoup(r.text, 'lxml')
        titles.append(soup.title.string)
        html_sources.append(soup)
    print (titles) #return titles of all 3 sites as a list
    print (html_sources)#return html_sources of all 3 sites as a list
    

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多