2013-11-12 3 views
0

Мы должны извлечь указанное количество блогов (n), прочитав их из текстового файла, содержащего список блогов.Извлечение данных блога в python

Затем я извлекаю данные блога и добавляю его в файл.

Это только часть основного задания применения nlp к данным.

До сих пор я сделал это:

import urllib2 
from bs4 import BeautifulSoup 
def create_data(n): 
    blogs=open("blog.txt","r") #opening the file containing list of blogs 

    f=file("data.txt","wt") #Create a file data.txt 

    with open("blog.txt")as blogs: 
     head = [blogs.next() for x in xrange(n)] 
     page = urllib2.urlopen(head['href']) 

     soup = BeautifulSoup(page) 
     link = soup.find('link', type='application/rss+xml') 
     print link['href'] 

     rss = urllib2.urlopen(link['href']).read() 
     souprss = BeautifulSoup(rss) 
     description_tag = souprss.find('description') 

     f = open("data.txt","a") #data file created for applying nlp 
     f.write(description_tag) 

Этот код не работает. Он работал на давая ссылку directly.like:

page = urllib2.urlopen("http://www.frugalrules.com") 

Я называю эту функцию из другого сценария, когда пользователь дает ввод n.

Что я делаю неправильно?

Traceback:

Traceback (most recent call last): 
    File "C:/beautifulsoup4-4.3.2/main.py", line 4, in <module> 
    create_data(2)#calls create_data(n) function from create_data 
    File "C:/beautifulsoup4-4.3.2\create_data.py", line 14, in create_data 
    page=urllib2.urlopen(head) 
    File "C:\Python27\lib\urllib2.py", line 127, in urlopen 
    return _opener.open(url, data, timeout) 
    File "C:\Python27\lib\urllib2.py", line 395, in open 
    req.timeout = timeout 
AttributeError: 'list' object has no attribute 'timeout' 
+0

Что значит «не работает» означает? Включите трассировку. – geoffspear

+0

Готово. Но если я делаю 'rss = urllib2.urlopen (ссылка ['href'])' трассировка _TypeError: индексы списка должны быть целыми числами, а не str_ Я новичок в этом, поэтому, пожалуйста, несите меня. – Remy

ответ

3

head список:

head = [blogs.next() for x in xrange(n)] 

Список индексируется целочисленными индексами (или ломтиками). Вы не можете использовать head['href'] когда head список:

page = urllib2.urlopen(head['href']) 

Трудно сказать, как это исправить, не зная, что содержимое blog.txt выглядит. Если каждая строка blog.txt содержит URL, то вы можете использовать:

with open("blog.txt") as blogs: 
    for url in list(blogs)[:n]: 
     page = urllib2.urlopen(url) 
     soup = BeautifulSoup(page.read()) 
     ... 
     with open('data.txt', 'a') as f: 
      f.write(...) 

Обратите внимание, что file является устаревшей формой open (который был удален в Python3). Вместо использования f=file("data.txt","wt") используйте более современный синтаксис with-statement (как показано выше).


Например,

import urllib2 
import bs4 as bs 

def create_data(n): 
    with open("data.txt", "wt") as f: 
     pass 
    with open("blog.txt") as blogs: 
     for url in list(blogs)[:n]: 
      page = urllib2.urlopen(url) 
      soup = bs.BeautifulSoup(page.read()) 

      link = soup.find('link', type='application/rss+xml') 
      print(link['href']) 

      rss = urllib2.urlopen(link['href']).read() 
      souprss = bs.BeautifulSoup(rss) 
      description_tag = souprss.find('description') 

      with open('data.txt', 'a') as f: 
       f.write('{}\n'.format(description_tag)) 

create_data(2) 

Я предполагаю, что вы открываете, запись и закрытие data.txt с каждым проходом через петлю, потому что вы хотите сохранить частичные результаты - может быть, в случае с программа вынуждена прекращать преждевременно.

В противном случае, было бы проще просто открыть файл один раз в самом начале:

with open("blog.txt") as blogs, open("data.txt", "wt") as f: 
+0

Содержание blog.txt - это только URL-адреса блога, такие как http://www.frugalrules.com http://momanddadmoney.com http://blogs.reuters.com/felix-salmon/ в разных строках – Remy

+0

У меня есть чтобы читать только первые n блогов в списке, извлекать данные из Интернета и записывать их все в файл. – Remy

+0

Это работает !!Огромное спасибо!! : ') Извините, не могу подтвердить ответ. Моя репутация слишком низкая. : / – Remy

Смежные вопросы