2014-05-02 53 views
-2

这里是我迄今为止的Python美丽的汤 - 功能

import urllib2 
from ntlm import HTTPNtlmAuthHandler 
from bs4 import BeautifulSoup 
import requests 
import os 
import bleach 
def stripAllTags(html): 
    if html is None: 
      return None 
    return ''.join(BeautifulSoup(html).findAll(text = True)) 
os.system('clear') 

user = '<user>' 
password = "<pass>" 
url = "<some url>" 

passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, url, user, password) 
# create the NTLM authentication handler 
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman) 

# create and install the opener 
opener = urllib2.build_opener(auth_NTLM) 
urllib2.install_opener(opener) 

data = urllib2.urlopen(url) 

soup = BeautifulSoup(data) 

table = soup.find('ul', {'class': 'dfwp-column dfwp-list'}) 
td = table.findAll('td') 
tr = table.findAll('tr') 
    for td in table: 
     for tr in td: 
     clean = bleach.clean(tr, tags=[], strip=True) 
     print clean 

我怎样才能正确地把它变成一个功能

table = soup.find('ul', {'class': 'dfwp-column dfwp-list'}) 
td = table.findAll('td') 
tr = table.findAll('tr') 
    for td in table: 
     for tr in td: 
     clean = bleach.clean(tr, tags=[], strip=True) 
     print clean 

我想它调用一个“为”

+0

你究竟想要'for'做什么?这部分代码应该只需要一次在任何脚本 – Amazingred

+0

我仍在构建这个,但此脚本解析来自我们客户的服务器信息共享点页面,所以我将需要为每个发现的客户做到这一点 – ondrovic

+0

您的功能将要做许多不必要的操作。你有for循环的问题。查看我的更新回答下面的完整runthrough – Amazingred

回答

2

好吧,首先你已经在你的代码中创建了一个urllib2.opener,然后你使用urllib2.urlopen()来调用这个网页.....所以你甚至不用你的opener或者你经历过的任何额外的项目创造。另外,在您的代码中指定用户名和密码时,我假设您将在某个时间点登录到网站。如果那是这种情况,那么你也将处于一个没有cookie处理的伤害世界。我已经重新组织了一些代码,并认为以下内容应该是一个很好的起点。

而且,这里是表演你,你指定的操作功能的演练......

  • 搜索具有类dfwp列dfwp列表
  • 的无序列表整个beautifulsoup对象
  • TD变量=所有“TD”在那场比赛
  • TR变量=所有标签“TR”的标签在同一场比赛中
  • 即使你还没有与这两个变量做任何事情....你摧毁他们通过创建一个使用相同变量名称的循环来覆盖这意味着他们的意思是什么都没有意义......
  • 对于每个具有该类名称的表:(提示只有一个表已定义,并且以该格式“for tr in td”完全不起作用)打印结果的干净...

它没有做它看起来像它的样子。

避免这个....你指定这些操作的新功能...

def myfunction(b): 
    """param is a soup instance""" 
    table=b.find('ul', {'class':'dfwp-column dfwp-list'}) 
    for td in table.findAll('td'): 
     for tr in td.findAll('tr'): 
      print bleach.clean(tr,tags=[], strip=True) 

更少的代码....而这样一来它正确地找到正确的数据和迭代。像这样:

  • 表是“dfwp列dfwp清单”的无序列表类
  • 它打印在表格
  • 发现在每一个“TD”标签中找到的每个“TR”标签漂白操作

只是试图有帮助...我已经清理并重新排序您的代码,以消除一些浪费并添加了已经提到的事情。现在试试这个:

from ntlm import HTTPNtlmAuthHandler 
from bs4 import BeautifulSoup 
import requests, os, bleach, urllib2, cookielib 

user='XXX' 
password='XXX' 
url='URL' 

cookies = cookielib.CookieJar() 
passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, url, user, password) 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies),HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman)) 

pagedata=opener.open(url) 
soup=BeautifulSoup(pagedata) 
+0

感谢您的澄清和信息将尝试你的,看看会发生什么 – ondrovic

+0

回溯(最近呼吁最后): 文件“dev。PY “23行,在 打印stripAllTags(汤) 文件 ”dev.py“,8号线,在stripAllTags 回报'。加入(BeautifulSoup(HTML).findAll(文= TRUE)) 文件” 的构建/bdist.macosx-10.9-intel/egg/bs4/__init__.py”,线路161,在__init__ 类型错误:‘NoneType’对象不是可调用的是我所得到的,当你想我在正确地执行它的打印strilAllTags(汤?你在使用作为输入) – ondrovic

+0

? – Amazingred