簡體   English   中英

使用報紙庫從用泡菜導入的列表中解析URL時出現問題

[英]Trouble parsing URLs from a list imported with pickle using newspaper library

我一直在嘗試傳遞網址列表以從頁面中提取文章。 如果我建立實際的網址列表(例如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

我已經嘗試修復了幾個小時,但我還沒有找到解決方法。 任何幫助將不勝感激。

如果我理解正確,則您要腌制/解開的對象是lista變量中的URL列表。 我會做這個假設。 因此,如果

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

給出您期望的輸出,則酸洗液已起作用。 列表中的實際內容似乎更有可能出現問題。

快速瀏覽Github上的news.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進行評論討論之后-問題是未選擇的列表中的URL以www.開頭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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM