2016-03-19 10 views
1

の子供たちのすべてのHREFを取得:私はのみからのすべてのリンクたいのpython BeautifulSoup私のpythonに新しいですし、私はこのhtmlコードからリンクや内部テキストを取得しようとしてきたのdiv

<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> 

http://link.com HREFと私は、このコード

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')) 

を試みたが、運できる人のHEL title

内部テキストpは私にあなたのコードで

答えて

1

を問題は、あなたがリストを返すfind_allを使用していることですあなたの二番目のforloopあなたが使用すべき場所find()

あなたはまた、

>>> 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 
forloop CSS selectorの代わりに、ネストされた を使用することができます
>>> 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 

1

all_liは実際にli要素のリストです。あなたはそれではなく、単一の要素であるかのようにそれを使用しようと次の行では:

all_li.find_all('a') 

代わりに、あなたはそれらの各をall_liの要素を反復処理し、find_allを呼び出す必要があります。

このような何かが動作するはず

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) 

これは、ULはその後、タイトルの属性を持つAさんからテキストを抽出し、選択したら

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

は、すべてのAタグを取得得られます輪郭。

あなたを与えるだろう
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]")] 

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

あなたが実際にクラスを一致する複数のULの持っている場合:

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) 
関連する問題