2014-05-02 52 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