2014-03-24 2 views
0

У меня есть следующий «веб-сайт» (здесь есть кусок HTML):Beutifulsoup разбора, получить информацию от нижестоящего тега

<div class="moduleBody"> 
    <div class="feature"> 
    <div class="feature"> 
     <h2> 
      <a href="somelink">sometext</a> 
     </h2> 
     <div class="relatedInfo"> 
       <span class="relatedTopics"> 
       <span class="timestamp">22 Mar 2014</span> 
     </div> 
     </div> 
</div> 

Я хотел бы, чтобы извлечь SOMETEXT и somelink , С этой целью я написал код python, вот он:

for links in soup.find_all('div','moduleBody'): 
     for link in links.find_all('div','feature'): 
      if not("video" in (link['href'])): 
       print "Name: "+link.text 
       #sibling_page=urllib2.urlopen("major_link"+link['href']) 
       print " Link extracted: "+link['href'] 

Однако этот код ничего не печатает. Не могли бы вы предложить, где моя ошибка?

ответ

0

Внутри вашей второй for цикла, ваша link переменная содержит ссылку на <h2>...</h2>, которые не имеют атрибут href.

Это сильно зависит от вашей структуры, но если <div class="feature"> тега всегда начинается с <h2> тегом, который содержит только <a> тега, то, что вы можете сделать, это:

for links in soup.find_all('div','moduleBody'): 
    for link in links.find_all('div','feature'): 
     anchor_tag = link.h2.a 
     if not 'video' in anchor_tag['href']: 
      print 'Name: %s' % anchor_tag.text 
      print 'Link extracted: %s' % anchor_tag['href'] 

Кстати, ваш HTML не хорошо -формат, должен быть закрыт первый тег <div class="feature">.

<div class="moduleBody"> 
<div class="feature"></div> 
<div class="feature"> 
    <h2> 
     <a href="somelink">sometext</a> 
    </h2> 
    <div class="relatedInfo"> 
      <span class="relatedTopics"> 
      <span class="timestamp">22 Mar 2014</span> 
    </div> 
    </div> 
</div> 
1

Ваш div не имеет атрибута href. Вы должны смотреть на один уровень вниз на элемент <a>.

from bs4 import BeautifulSoup 

html = """ 
<div class="moduleBody"> 
    <div class="feature"> 
    <div class="feature"> 
     <h2> 
      <a href="somelink">sometext</a> 
     </h2> 
     <div class="relatedInfo"> 
       <span class="relatedTopics"> 
       <span class="timestamp">22 Mar 2014</span> 
     </div> 
     </div> 
</div> 
""" 

soup = BeautifulSoup(html) 

for links in soup.find_all("div", "moduleBody"): 
    for link in links.find_all("div", "feature"): 
     for a in links.find_all("a"): 
      if not "video" in a['href']: 
       print("Name: " + a.text) 
       print("Link extracted: " + a['href']) 

Печать:

Name: sometext 
Link extracted: somelink 
Name: sometext 
Link extracted: somelink 

Он находит его в два раза, так как ваш HTML нарушается. BeautifulSoup фиксирует это следующим образом:

<div class="moduleBody"> 
<div class="feature"> 
    <div class="feature"> 
    <h2> 
    <a href="somelink"> 
    sometext 
    </a> 
    </h2> 
    <div class="relatedInfo"> 
    <span class="relatedTopics"> 
    <span class="timestamp"> 
     22 Mar 2014 
    </span> 
    </span> 
    </div> 
    </div> 
</div> 
</div> 
Смежные вопросы