2017-08-07 1 views
1
zu ändern

Ich habe eine Antwort auf eine Frage, die ich auf SO here gefragt, die scheint zu arbeiten, wenn ich den Code einmal ausführen.BeautifulSoup: Ausgabe beginnt sich nach einer bestimmten Anzahl von Iterationen in Schleife

Wenn ich jedoch versuche, es in einer Schleife zu implementieren, beginnen die Ergebnisse nach der dritten Iteration zu ändern. Dies ist nur ein Beispiel, das jedes Mal dieselbe URL aufruft.

from bs4 import BeautifulSoup 
import requests 
import re 

for x in range(5): 
    url = 'https://www.adviserinfo.sec.gov/IAPD/content/viewform/adv/Sections/iapd_AdvPrivateFundReportingSection.aspx?ORG_PK=161227&FLNG_PK=05C43A1A0008018C026407B10062D49D056C8CC0' 
    html = requests.get(url, headers={'Cookie': 'PHPSESSID=notimportant'}) 
    soup = BeautifulSoup(html.text, "lxml") 

    tags = list(soup.find_all('span', {'class':'PrintHistRed'})) 
    tags.extend(list(soup.find_all('img', alt=re.compile('Radio|Checkbox')))[2:])  # 2: skip "are you an adviser" at the top 
    tags.extend([t.parent for t in soup.find_all(text="No Information Filed")]) 

    output = [] 

    for entry in sorted(tags): 
     if entry.name == 'img': 
      alt = entry['alt'] 
      if 'Radio' in alt: 
       output.append('NO' if 'not selected' in alt else 'YES') 
      else: 
       output.append('O' if 'not checked' in alt else 'X') 
     else: 
      output.append(entry.text) 

    print output[:9] 

Ich habe versucht, in einem time.sleep() an verschiedenen Stellen im Code setzen, dachte, es mit dem, aber kein Glück zu tun hatte. Ich frage mich auch, ob etwas mit Cookies zu tun hat? Aber haben Sie keine Idee, wirklich ...

Jede Hilfe wird sehr geschätzt!

+0

Was ist, wenn Sie die Importe innerhalb der Schleife setzen? –

+0

Das ändert den Ausgangswert nach der zweiten Iteration merkwürdig. Nicht sicher, ob das irgendjemanden mit irgendwelchen Hinweisen versorgt ... –

+1

Gut das ist komisch. –

Antwort

0

Sie sortieren "Objekte" (vom Typ bs4.element.Tag, siehe https://www.crummy.com/software/BeautifulSoup/bs4/doc/#tag) und keine Zeichenfolgen in Ihrem Code, so dass Sie seltsames Verhalten bekommen.

Wechsel:

for entry in sorted(tags): 

zu:

for entry in tags: 

Dann gibt sie:

[u'APEX INVESTMENT FUND V, L.P.', u'805-2054766781', u'Delaware', u'United States', u'$\xa07,402,178', u'$\xa05,000,000', u'47', u'4', u'28'] 
[u'APEX INVESTMENT FUND V, L.P.', u'805-2054766781', u'Delaware', u'United States', u'$\xa07,402,178', u'$\xa05,000,000', u'47', u'4', u'28'] 
[u'APEX INVESTMENT FUND V, L.P.', u'805-2054766781', u'Delaware', u'United States', u'$\xa07,402,178', u'$\xa05,000,000', u'47', u'4', u'28'] 
[u'APEX INVESTMENT FUND V, L.P.', u'805-2054766781', u'Delaware', u'United States', u'$\xa07,402,178', u'$\xa05,000,000', u'47', u'4', u'28'] 
[u'APEX INVESTMENT FUND V, L.P.', u'805-2054766781', u'Delaware', u'United States', u'$\xa07,402,178', u'$\xa05,000,000', u'47', u'4', u'28'] 

in Reaktion Aktualisiert Stellung zu nehmen, wenn Sie den Auftrag zu erhalten, brauchen so etwas wie diese versuchen, (Sie könnten den Code mehr verdichten, wenn Sie möchten, es gibt keine Notwendigkeit für zwei Anweisungen):

from bs4 import BeautifulSoup 
import requests 
import re 

for x in range(5): 
    url = 'https://www.adviserinfo.sec.gov/IAPD/content/viewform/adv/Sections/iapd_AdvPrivateFundReportingSection.aspx?ORG_PK=161227&FLNG_PK=05C43A1A0008018C026407B10062D49D056C8CC0' 
    html = requests.get(url, headers={'Cookie': 'PHPSESSID=notimportant'}) 
    soup = BeautifulSoup(html.text, "lxml") 

    regexp = re.compile(r'Radio|Checkbox') 
    mytags = [] 
    tags = soup.find_all(['span', 'img']) 
    for tag in tags: 
     if (tag.has_attr('class') and 'PrintHistRed' in tag['class']) or (tag.has_attr('alt') and regexp.search(tag['alt'])): 
      mytags.append(tag) 
     elif (tag.text == "No Information Filed"): 
      mytags.append(tag.parent) 

    output = [] 

    for entry in mytags: 
     if entry.name == 'img': 
      alt = entry['alt'] 
      if 'Radio' in alt: 
       output.append('NO' if 'not selected' in alt else 'YES') 
      else: 
       output.append('O' if 'not checked' in alt else 'X') 
     else: 
      output.append(entry.text) 

    print (output) 
+0

Ich brauche Ausgänge zu tun sortiert werden, wie sie auf der Website erscheinen. Dies gibt mir nicht die Ausgabe in der richtigen Reihenfolge, was sortierte (Tags) tut (manchmal). Ich sollte die Beispielausgabe erweitern, damit Sie sehen, was ich meine. –

Verwandte Themen