有漂亮汤的Python不会在页面中循环。

有漂亮汤的Python不会在页面中循环。,python,beautifulsoup,Python,Beautifulsoup,嘿,伙计们,这是我的第一篇帖子。我是一名营销人员(EWW),我是Python新手,所以请不要向我开枪 我通过反复试验来学习,破解像这样的脚本 谁能告诉我如何循环浏览网站的所有页面,然后打印每个url的信息 url = "http://example.com" urls = [url] # Stack of urls to scrape visited = [url] # Record of scraped urls htmltext = urllib.urlopen(urls[0]).read

嘿,伙计们,这是我的第一篇帖子。我是一名营销人员(EWW),我是Python新手,所以请不要向我开枪

我通过反复试验来学习,破解像这样的脚本

谁能告诉我如何循环浏览网站的所有页面,然后打印每个url的信息

url = "http://example.com"

urls = [url] # Stack of urls to scrape
visited = [url] # Record of scraped urls
htmltext = urllib.urlopen(urls[0]).read()


# While stack of urls is greater than 0, keep scraping for links
while len(urls) > 0:
try:
    htmltext = urllib.urlopen(urls[0]).read()

# Except for visited urls
except:
    print urls[0]

# Get and Print Information
soup = BeautifulSoup(htmltext, "lxml")
urls.pop(0)
info = soup.findAll(['title', 'h1', 'h2', 'p'])
for script in soup("script"):
soup.script.extract()

print info

# Number of URLs in stack
print len(urls)

# Append Incomplete Tags
for tag in soup.findAll('a',href=True):
    tag['href'] = urlparse.urljoin(url,tag['href'])
    if url in tag['href'] and tag['href'] not in visited:
        urls.append(tag['href'])
        visited.append(tag['href'])
评论:

  • 我看到
    访问了
    两次。在一个实例中,它用作URL列表,在另一个实例中用作HTML元素列表。这很淘气
  • while
    循环中,每个url都从其站点请求并读取到
    htmltext
    中,禁止出现
    异常。但是请注意,每次通过循环时,
    htmltext
    之前的内容都会被覆盖并丢失。每次
    htmltext
    可用时都必须调用BeautifulSoup,然后在再次创建
    soup
    之前处理来自BeautifulSoup的
    soup
按照您的风格,我将以这种方式编写基本的代码

import requests
import bs4

urls = ['url_1', 'url_2', 'url_3', 'url_4', 'url_5', 'url_6', 'url_7', 'url_8', 'url_9', 'url_10']

while urls:
    url = urls.pop(0)
    print (url)
    try:
        htmltext = requests.get(url).content
    except:
        print ('*** attempt to open '+url+' failed')
        continue
    soup = bs4.BeautifulSoup(htmltext, 'lxml')
    title = soup.find('title')
    print (title)
  • 我使用请求库而不是urllib,因为它通常使生活更轻松
  • 由于您使用
    url
    列表的
    pop
    方法删除其项目,因此我们不需要保留
    访问的
    url的记录。当它们从
    URL
    中删除时,列表会变短,并最终变为空
  • 而URL
    询问
    URL
    是否为空
  • 这段代码的要点是,它显示了查询远程站点和调用BeautifulSoup是如何在列表
    URL
    的同一个循环中进行的
评论:

  • 我看到
    访问了
    两次。在一个实例中,它用作URL列表,在另一个实例中用作HTML元素列表。这很淘气
  • while
    循环中,每个url都从其站点请求并读取到
    htmltext
    中,禁止出现
    异常。但是请注意,每次通过循环时,
    htmltext
    之前的内容都会被覆盖并丢失。每次
    htmltext
    可用时都必须调用BeautifulSoup,然后在再次创建
    soup
    之前处理来自BeautifulSoup的
    soup
按照您的风格,我将以这种方式编写基本的代码

import requests
import bs4

urls = ['url_1', 'url_2', 'url_3', 'url_4', 'url_5', 'url_6', 'url_7', 'url_8', 'url_9', 'url_10']

while urls:
    url = urls.pop(0)
    print (url)
    try:
        htmltext = requests.get(url).content
    except:
        print ('*** attempt to open '+url+' failed')
        continue
    soup = bs4.BeautifulSoup(htmltext, 'lxml')
    title = soup.find('title')
    print (title)
  • 我使用请求库而不是urllib,因为它通常使生活更轻松
  • 由于您使用
    url
    列表的
    pop
    方法删除其项目,因此我们不需要保留
    访问的
    url的记录。当它们从
    URL
    中删除时,列表会变短,并最终变为空
  • 而URL
    询问
    URL
    是否为空
  • 这段代码的要点是,它显示了查询远程站点和调用BeautifulSoup是如何在列表
    URL
    的同一个循环中进行的

你刮取一个网站页面的方式通常与刮取另一个网站页面的方式不同,通常差异很大。事实上,有时美如苏醒,有时美如苏醒。我们每个人都积累了一系列技能,可以应用于越来越多的页面。你应该尝试删除一个站点,如果你不能完成任务,请向我们展示你的代码,并询问有关你需要了解的内容的具体问题。谢谢比尔,我将在以后的所有帖子中提供反馈。我可以让这个脚本成功运行,但它会一遍又一遍地刮同一页。我认为具体问题在“#附加不完整标记”部分的某个地方,urlparse.urljoin似乎使用了相同的url,而不是移动到下一个follow链接。。如果我在正确的轨道上?你刮取一个网站页面的方式通常与刮取另一个网站页面的方式不同,通常差异很大。事实上,有时美如苏醒,有时美如苏醒。我们每个人都积累了一系列技能,可以应用于越来越多的页面。你应该尝试删除一个站点,如果你不能完成任务,请向我们展示你的代码,并询问有关你需要了解的内容的具体问题。谢谢比尔,我将在以后的所有帖子中提供反馈。我可以让这个脚本成功运行,但它会一遍又一遍地刮同一页。我认为具体问题在“#附加不完整标记”部分的某个地方,urlparse.urljoin似乎使用了相同的url,而不是移动到下一个follow链接。。如果我在正确的轨道上?