无法使用报纸库从使用pickle导入的列表中解析URL

时间:2015-01-16 15:14:49

标签: python pickle python-newspaper

我一直在尝试传递一个网址列表来从网页中提取文章。如果我建立一个实际的网址列表(例如lista ='http://www.zeit.de',...),提取(使用报纸)就可以正常工作。但是,即使打印列表有效,从另一个文件中取出列表也不起作用。以下是代码:

import io
import newspaper
from newspaper import Article
import pickle

lista = ['http://www.zeit.de',
         'http://www.guardian.co.uk',
         'http://www.zeit.de',
         'http://www.spiegel.de']

apple = 0
banana = lista[apple]
orange = "file_" + str(apple) + ".txt" 

while apple <4 :

   first_article = Article(url= banana , language='de')     
   first_article.download()    
   first_article.parse()

   print(first_article.text).encode('cp850', errors='replace')

   with io.open(orange, 'w', encoding='utf-8') as f:
       f.write(first_article.text)

   apple += 1
   banana = lista[apple]
   orange = "file_" + str(apple) + ".txt" 

以上MCVE工作正常。当我取消列表列表时,将其打印到控制台时可以正常工作,例如使用此脚本:

import pickle
import io

lista = pickle.load( open( "save.p", "rb" ) )    
print lista

List输出的示例如下所示

['www.zeit.de/1998/51/Psychokrieg_mit_Todesfolge', 'www.zeit.de/1998/51/Raffgierig', 'www.zeit.de/1998/51
/Runter_geht_es_schnell', 'www.zeit.de/1998/51/Runter_mit_den_Zinsen_', 'www.zeit.de/1998/51/SACHBUCH', 'www.zeit.de/199
8/51/Schwerer_Irrtum', 'www.zeit.de/1998/51/Silvester_mit_Geist', 'www.zeit.de/1998/51/Tannen_ohne_Nachwuchs', 'www.zeit
.de/1998/51/This_is_Mu_hen', 'www.zeit.de/1998/51/Tuechtig', 'www.zeit.de/1998/51/Ungelehrig']

但列表中有数千个网址。

显示的错误消息并没有告诉我太多(下面的完整追溯)

Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\newspaper\parsers.py", line 53, in fromstring
    cls.doc = lxml.html.fromstring(html)
  File "C:\Python27\lib\site-packages\lxml\html\__init__.py", line 706, in fromstring
    doc = document_fromstring(html, parser=parser, base_url=base_url, **kw)
  File "C:\Python27\lib\site-packages\lxml\html\__init__.py", line 600, in document_fromstring
    value = etree.fromstring(html, parser, **kw)
  File "lxml.etree.pyx", line 3032, in lxml.etree.fromstring (src\lxml\lxml.etree.c:68121)
  File "parser.pxi", line 1786, in lxml.etree._parseMemoryDocument (src\lxml\lxml.etree.c:102470)
  File "parser.pxi", line 1667, in lxml.etree._parseDoc (src\lxml\lxml.etree.c:101229)
  File "parser.pxi", line 1035, in lxml.etree._BaseParser._parseUnicodeDoc (src\lxml\lxml.etree.c:96139)
  File "parser.pxi", line 582, in lxml.etree._ParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:91290)
  File "parser.pxi", line 683, in lxml.etree._handleParseResult (src\lxml\lxml.etree.c:92476)
  File "parser.pxi", line 633, in lxml.etree._raiseParseError (src\lxml\lxml.etree.c:91939)
XMLSyntaxError: None

我一直试图解决这个问题几个小时,但我还没找到办法。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您尝试挑选/取消选择的对象就是lista变量中的URL列表。我会做出这个假设。因此,如果

lista = pickle.load( open( "save.p", "rb" ) ) 
print lista 

给出你期望的输出,然后pickle负载工作。似乎更有可能是列表中实际存在的问题。

快速浏览一下Github上的newspaper.py代码 - 我们看到这一行引发了错误:

 cls.doc = lxml.html.fromstring(html)

查看Article.parse() - 调用Parser.fromstring()方法 - 所以这是一个很好的选择,这里的问题是当你调用first_article.parse()时。

报纸库中的那段代码带有评论

 # Enclosed in a `try` to prevent bringing the entire library
 # down due to one article (out of potentially many in a `Source`)

所以我认为这很可能是从你的菜单中导入的一个(第一个?)文章中的一个问题

<强> 编辑:

在OP问题编辑之后

- 您的代码问题是列表中第一个被怀疑的URL。在控制台中手动尝试,例如

url = 'www.zeit.de/1998/51/Psychokrieg_mit_Todesfolge'
first_article = Article(url, language='de')
first_article.download()
first_article.parse()

它给出了相同(或类似)的错误。但是,如果我尝试不同的文章 - 例如http://www.zeit.de/community/2015-01/suizid-tochter-entscheidung-akzeptieren,上面的代码工作正常,如果输入

,我会看到文本
print(first_article.text.encode('cp850', errors='replace'))

所以,这是错误的内容,而不是泡菜。出于某种原因,lxml库和报纸库无法解析该文章。我不能说为什么,当我在浏览器中访问它时它看起来不错。

<强> EDIT2:

与OP的评论讨论后 - 问题是,未打开列表中的网址开始www.而不是http:\\www.。要解决这个问题

url = ''
lista = pickle.load( open( "save.p", "rb" ) )

for u in lista:
    if u.startswith('www'):
        url = 'http://' + u
    else:
        url = u

# Carry on with your url processing here