2017-03-25 1 views
2

Ich benutze bs4 mit Python und versuchen, Daten von einer Webseite zu holen. Link Ich habe inspect Element über die Informationen, die ich möchte, aber beide haben das gleiche Tag, Klasse.Web Scraping, Wie extrahiert man Daten aus zwei gleichen Tags mit bs4 in Python

   <a class="cell__value" data-tracker-action="click" data-tracker-label="information_technology.01" href="/markets/sectors/information-technology"> 
      Information Technology 
      </a> 
      </div> 
      <div class="cell__return"> 
      <div class="cell__label"> 
      % Price Change 
      </div> 
      <div class="cell__value" data-type="better"> 
      +0.05% 
      </div> 
      </div> 
      </div> 
      <div class="cell"> 
      <div class="cell__name"> 
      <div class="cell__label"> 
      Industry 
      </div> 
      <a class="cell__value" data-tracker-action="click" data-tracker-label="information_technology.02" href="/markets/sectors/information-technology"> 
      Software &amp; Services 
      </a> 
      </div> 
      <div class="cell__return"> 
      <div class="cell__label"> 
      % Price Change 
      </div> 
      <div class="cell__value" data-type="worse"> 
      -0.04% 
      </div> 
      </div> 
      </div> 
     </div> 

ich es so mache:

sect= soup.find("a",{"data-tracker-label":"information_technology.01"}) 
print sect.text 
sect_per= soup.find("div",{"data-type":"worse"or"better"}) 
print sect_per.text 
ind=soup.find("a",{"data-tracker-label":"information_technology.02"}) 
print ind.text 
ind_per=soup.find("div",{"div",{"data-type":"worse"or"better"}) 
print ind_per 

beidDruck ind_perundDruck ind_pergibt mir gleiches Ergebnis wegen derselben Klasse und Tag

benötigen i+ 0,05%und-0.04%jeweils zu extrahieren.

Bitte schlagen Sie mir vor, es zu tun.

Antwort

0

or gibt den linken Operanden, wenn der linke Operand Wahrheitswert (nicht leere Zeichenfolge für string) ist:

>>> "worse" or "better" 
'worse' 

Also, die folgende Zeile ein:

ind_per = soup.find("div",{"div",{"data-type":"worse" or "better"}) 

ist grundsätzlich gleiche tun mit:

ind_per = soup.find("div",{"div",{"data-type":"worse"}) 

Sie müssen sie separat abfragen:

ind_per = soup.find("div",{"div",{"data-type": "worse"}) 
print ind_per 
ind_per = soup.find("div",{"div",{"data-type": "better"}) 
print ind_per 

oder for Schleife:

for data_type in ('worse', 'better'): 
    ind_per = soup.find("div",{"div",{"data-type": data_type}) 
    print ind_per 
2
soup = BeautifulSoup(example, "html.parser") 

for cell in soup.find_all("div", class_="cell"): 
    name = "" 
    namecell = cell.find("a", class_="cell__value", text=True) 
    if namecell is not None: 
     name = namecell.get_text(strip=True) 
    price_chage = cell.find("div", class_="cell__value").get_text(strip=True) 
    print ("%s: Price Change: %s" % (name, price_chage)) 

Welche Ausgänge:

Information Technology: Price Change: +0.05%

Software & Services: Price Change: -0.04%

Sie, dass die Werte für die Weiterverarbeitung speichern .

+0

Fehler: name = cell.find ("a", Klasse _ = "cell__value"). Get_text (strip = True) AttributError: 'NoneType' Objekt hat kein Attribut 'get_text' –

+0

Danke für die Unterstützung. Danke vielmals! –

+0

noch eine Frage @Zroq Wenn Sie helfen könnten. Wie konvertiert man "Stand 07:05 AM EDT 3/24/2017" in JJJJ/MM/TT HH: MM: SS in Python –