我的循环没有运行

时间:2015-11-27 06:09:42

标签: python loops for-loop beautifulsoup

我正在使用Python编写代码以使用Beautiful soup获取URL中的所有'a'标记,然后我使用位置3处的链接并按照该链接,我将重复此过程大约18次。我包含了下面的代码,该过程重复了4次。当我运行此代码时,我在结果中得到相同的4个链接。我应该得到4个不同的链接。我认为我的循环中存在一些问题,特别是在y = url的行中。我需要帮助找出问题所在。

import re
import urllib
from BeautifulSoup import *
list1=list()
url = 'https://pr4e.dr-chuck.com/tsugi/mod/python-data/data/known_by_Fikret.html'

for i in range (4):  # repeat 4 times
    htm2= urllib.urlopen(url).read()
    soup1=BeautifulSoup(htm2)
    tags1= soup1('a')
    for tag1 in tags1:
        x2 = tag1.get('href', None)
        list1.append(x2)
    y= list1[2]
    if len(x2) < 3:  # no 3rd link
        break  # exit the loop
    else:
        url=y             
    print y

2 个答案:

答案 0 :(得分:0)

您继续将第三个链接发送到您的结果列表。相反,你应该添加第三个链接OF THAT ITERATION(soup('a')[2]),然后重新分配你的网址然后再去。

url = 'https://pr4e.dr-chuck.com/tsugi/mod/python-data/data/known_by_Fikret.html'
result = []

for i in range(4):
    soup = BeautifulSoup(urllib.urlopen(url).read())
    links = soup('a')
    for link in links:
        result.append(link)
    try:
        third_link = links[2]['href']
    except IndexError:  # less than three links
        break
    else:
        url = third_link
        print(url)

这在递归函数中实际上非常简单:

def get_links(url):
    soup = BeautifulSoup(urllib.urlopen(url).read())
    links = soup('a')
    if len(links) < 3:
        # base case
        return links
    else:
        # recurse on third link
        return links + get_links(links[2]['href'])

你甚至可以修改它以确保你没有太深入

def get_links(url, times=None):
    '''Returns all <a> tags from `url` and every 3rd link, up to `times` deep

    get_links("protocol://hostname.tld", times=2) -> list
    if times is None, recurse until there are fewer than 3 links to be found
    '''

    def _get_links(url, TTL):
        soup = BeautifulSoup(urllib.urlopen(url).read())
        links = soup('a')
        if (times is not None and TTL >= times) or \
           len(links) < 3:
            # base case
            return links
        else:
            return links + _get_links(links[2]['href'], TTL+1)
    return _get_links(url, 0)

答案 1 :(得分:0)

您当前的代码 y= list1[2] 只打印位于list1索引2的URL。由于该列表仅被追加,list[2]没有变化。如果您需要不同的URL,则应在每次打印时选择不同的索引。我不确定您尝试打印的具体内容,但y= list1[-1]例如最终会打印在该次迭代中添加到列表中的最后一个URL(每次都不同)。 / p>