2016-08-25 5 views
1

Я пытаюсь создать Python Crawler с помощью BeautifulSoup, но получаю сообщение об ошибке, которое я пытаюсь записать в файл нестроковый или другой тип символьного буфера. Изучив вывод программы, я обнаружил, что мой список содержит много элементов, которые являются None. Помимо наличия Нет, у меня также есть много изображений и вещей, которые не являются ссылками, но являются ссылками на изображение внутри моего списка. Как добавить URL-адреса в список?Python - Проблемы с созданием списка URL-адресов с помощью BeautifulSoup

import urllib 
    from BeautifulSoup import * 

    try: 
     with open('url_file', 'r') as f: 
      url_list = [line.rstrip('\n') for line in f] 
      f.close() 
     with open('old_file', 'r') as x: 
      old_list = [line.rstrip('\n') for line in f] 
      f.close() 
    except: 
     url_list = list() 
     old_list = list() 
     #for Testing 
     url_list.append("http://www.dinamalar.com/") 


    count = 0 


    for item in url_list: 
     try: 
      count = count + 1 
      if count > 5: 
       break 

      html = urllib.urlopen(item).read() 
      soup = BeautifulSoup(html) 
      tags = soup('a') 

      for tag in tags: 

       if tag in old_list: 
        continue 
       else: 
        url_list.append(tag.get('href', None)) 


      old_list.append(item) 
      #for testing 
      print url_list 
     except: 
      continue 

    with open('url_file', 'w') as f: 
     for s in url_list: 
      f.write(s) 
      f.write('\n') 


    with open('old_file', 'w') as f: 
     for s in old_list: 
      f.write(s) 
+0

Вы пытаетесь отфильтровать все, что не является строкой? –

+0

Нет, я пытаюсь отфильтровать все, что не является настоящим URL. –

ответ

1

Во-первых, использовать bs4 не дольше не поддерживается BeautifulSoup3, ваша ошибка в том, что не все анкеры имеют hrefs так вы пытаетесь не писать None который вызывает вашу ошибку, используйте find_all и набор HREF = True так что вы только найти якоря теги, которые имеют атрибут HREF:

soup = BeautifulSoup(html) 
tags = soup.find_all("a", href=True) 

Также никогда не использовать одеяло, за исключением заявлений, всегда поймать ошибки, которые вы ожидаете, и, по крайней мере, печатать их, когда они происходят. Что касается , у меня также есть много изображений и вещей, которые не являются ссылками, если вы хотите отфильтровать определенные ссылки, то вы должны быть более конкретными, либо искать теги, которые содержат то, что вас интересует, если возможно , используйте регулярное выражение href=re.compile("some_pattern") или использовать CSS-селекторы:

# hrefs starting with something 
"a[href^=something]" 

# hrefs that contain something 
"a[href*=something]" 

# hrefs ending with something 
"a[href$=something]" 

только вы знаете структуру HTML и что вы хотите, чтобы то, что вы используете полностью зависит от вас, чтобы решить.

+0

Большое вам спасибо! Кроме того, я не знаком с тем, что вы подразумеваете под одеялом, кроме заявления. Означает ли это, что я просто ломаю какое-то неспецифическое исключение, не делая ничего об этом? –

+0

И как использовать селектор css в моем коде? –

+0

@VishalVenkataraman Я считаю, что он имеет в виду, что вы должны быть за исключением конкретной ошибки. Например, 'ImportError' или' FileNotFoundError', а не только самый общий «Исключение». –