使用报纸库从 pickle 导入的列表中解析 URL 时遇到问题
Trouble parsing URLs from a list imported with pickle using newspaper library
我一直在尝试传递 url 列表以从页面中提取文章。如果我构建一个实际的 url 列表(例如 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
列表输出示例如下所示
['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']
但是列表中有数千个 url。
显示的错误消息并没有告诉我太多(下面的完整回溯)
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
几个小时以来,我一直在努力解决这个问题,但就是没找到办法。任何帮助将不胜感激。
如果我没理解错的话,你试图 pickle/unpickle 的对象是 lista 变量中的 URLs 列表。我会做出这样的假设。因此,如果
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`)
所以我认为这很可能是您列表中从 pickle 导入的其中一篇(第一篇?)文章的问题
编辑:
以下 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 进行评论讨论后 - 问题是 unpickled 列表中的 URL 开始于 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
我一直在尝试传递 url 列表以从页面中提取文章。如果我构建一个实际的 url 列表(例如 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
列表输出示例如下所示
['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']
但是列表中有数千个 url。
显示的错误消息并没有告诉我太多(下面的完整回溯)
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
几个小时以来,我一直在努力解决这个问题,但就是没找到办法。任何帮助将不胜感激。
如果我没理解错的话,你试图 pickle/unpickle 的对象是 lista 变量中的 URLs 列表。我会做出这样的假设。因此,如果
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`)
所以我认为这很可能是您列表中从 pickle 导入的其中一篇(第一篇?)文章的问题
编辑:
以下 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 进行评论讨论后 - 问题是 unpickled 列表中的 URL 开始于 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