2016-03-19 4 views
1

Ich bin neu in Python und ich habe versucht, Links zu erhalten und inneren Text aus HTML-Code:Python BeautifulSoup alle href bei Kindern von div bekommen

<div class="someclass"> 
    <ul class="listing"> 
     <li> 
      <a href="http://link1.com" title="">title1</a> 
       </li> 
     <li> 
      <a href="http://link2.com" title="">title2</a> 
       </li> 
     <li> 
      <a href="http://link3.com" title="">title3</a> 
       </li> 
     <li> 
      <a href="http://link4.com" title="">title4</a> 
        </li> 
    </ul> 
</div> 

Ich mag nur und alle Links von href http://link.com und der innere Text title

ich diesen Code versucht

div = soup.find_all('ul',{'class':'listing'}) 
for li in div: 
    all_li = li.find_all('li') 
    for link in all_li.find_all('a'): 
     print(link.get('href')) 

aber kein Glück kann jemand hel p me

Antwort

1

Das Problem ist, dass Sie find_all verwenden, die eine Liste zurückgibt in Ihre zweite forloop wo sollten Sie find()

verwenden
>>> for ul in soup.find_all('ul', class_='listing'): 
...  for li in ul.find_all('li'): 
...   a = li.find('a') 
...   print(a['href'], a.get_text()) 
... 
http://link1.com title1 
http://link2.com title2 
http://link3.com title3 
http://link4.com title4 

Sie können auch eine CSS selector anstelle von verschachtelten forloop

>>> for a in soup.select('.listing li a'): 
...  print(a['href'], a.get_text(strip=True)) 
... 
http://link1.com title1 
http://link2.com title2 
http://link3.com title3 
http://link4.com title4 
verwenden
1

In Ihrem Code ist all_li eigentlich eine Liste von li Elemente. In der nächsten Zeile versuchen Sie, es zu benutzen, als ob es ein einzelnes Element stattdessen war:

all_li.find_all('a') 

Stattdessen müssen Sie durch Elemente von all_li iterieren und find_all auf jeder von ihnen nennen.

So etwas sollte funktionieren:

uls = soup.find_all('ul', {'class': 'listing'}) 
for ul in uls: 
    for li in ul.find_all('li'): 
     for link in li.find_all('a'): 
      url = link.get('href') 
      contents = link.text 
      print (url, contents) 

Diese Ausbeute wird

('http://link1.com', 'title1') 
('http://link2.com', 'title2') 
('http://link3.com', 'title3') 
('http://link4.com', 'title4') 
1

all a-Tags erhalten, sobald Sie die ul extrahieren Sie den Text aus dem A mit dem Titel Attribute auswählen und der hrefs.

from bs4 import BeautifulSoup 

html = """<div class="someclass"> 
    <ul class="listing"> 
     <li> 
      <a href="http://link1.com" title="">title1</a> 
       </li> 
     <li> 
      <a href="http://link2.com" title="">title2</a> 
       </li> 
     <li> 
      <a href="http://link3.com" title="">title3</a> 
       </li> 
     <li> 
      <a href="http://link4.com" title="">title4</a> 
        </li> 
    </ul> 
</div>""" 

soup = BeautifulSoup(html,"lxml") 
ul = soup.select("ul.listing")[0] 
links = [a["href"] for a in ul.select("a[href]")] 
text = [a.text for a in ul.select("a[title]")] 

Welche wird Ihnen:

['title1', 'title2', 'title3', 'title4'] 
['http://link1.com', 'http://link2.com', 'http://link3.com', 'http://link4.com'] 

Wenn Sie tatsächlich mehrere UL haben, die die Klasse entsprechen:

uls = soup.select("ul.listing") 
links = [a["href"] for ul in uls for a in ul.select("a[href]") ] 
text = [a.text for ul in uls for a in ul.select("a[title]")] 

print(text) 
print(links) 
Verwandte Themen