2016-01-18 2 views
1

В моем коде я установил путь для файла txt к пути к скрипту, но по какой-то причине после того, как программа записывает некоторые файлы txt для нескольких ссылок, она бросает эта ошибка «FileNotFoundError: [Errno 2] Нет такого файла или каталога:« Я действительно не понимаю, почему для некоторых ссылок он работает, но для других он не может найти каталог.Нет такой ошибки в файле или каталоге (python)

from lxml import html 
import requests, os.path 
spath = os.path.dirname(__file__) ## finds path of script 
main_pg = requests.get("http://www.nytimes.com/") ## input site here 
with open(os.path.join(spath, "Main.txt"),"w", encoding='utf-8') as doc: 
    doc.write(main_pg.text) 
tree = html.fromstring(main_pg.content) 
hrefs = tree.xpath('//a[starts-with(@href, "http:") or starts-with(@href,"https:") or starts-with(@href,"ftp:")]/@href') ## To avoid non-absolute hrefs 
for href in hrefs: 
    link_pg = requests.get(href) 
    tree2 = html.fromstring(link_pg.content) 
    doc_title = tree2.xpath('//html/head/title/text()') ## selects title of text from each link 
    with open(os.path.join(spath, "%s.txt"%doc_title), "w", encoding ='utf-8') as href_doc: 
     href_doc.write(link_pg.text) 
+0

использования скорее 'spath = os.path.dirname (sys.argv [0])' – SIslam

+0

Какой файл он не находит? Что такое каталог? Что такое файл? Неверно ли символы 'doc_title' содержат символы в окнах? –

+0

Например, на главной веб-странице New York Times она выдает эту ошибку «FileNotFoundError: [Errno 2] Нет такого файла или каталога:« ['Hereâ \\ x80 \\ x99s, что вы пропустили в дискуссии - The New York Times'] .txt "", но по какой-то причине он может создавать документы txt для других ссылок, а не только этот. Также SIslam, я попытался изменить имя dirname и по-прежнему получил ту же ошибку. – JJ47

ответ

1

Я вижу, что существует несколько ошибок - BTW вам нужно дезинфицировать имя вашего файла, прежде чем использовать его в качестве имени. doc_title верните список, так как имя файла недействительно, поэтому используйте функцию join, чтобы получить строку из списка. После получения строки из списка удалите из нее недопустимый символ имени файла и используйте в качестве имени файла.

Попробуйте ниже (Python 2.7) -

import os,sys,codecs 
from lxml import html 
import requests, os.path,re 
spath = os.path.dirname(__file__) ## finds path of script 
#spath = os.path.dirname(sys.argv[0])## or use this 
main_pg = requests.get("http://www.nytimes.com/") ## input site here 
with codecs.open(os.path.join(spath, "Main.txt"),"w", encoding='utf-8') as doc: 
    doc.write(main_pg.text) 
tree = html.fromstring(main_pg.content) 
hrefs = tree.xpath('//a[starts-with(@href, "http:") or starts-with(@href,"https:") or starts-with(@href,"ftp:")]/@href') ## To avoid non-absolute hrefs 
for href in hrefs: 
    link_pg = requests.get(href) 
    tree2 = html.fromstring(link_pg.content) 
    doc_title = tree2.xpath('//html/head/title/text()') ## selects title of text from each link 
    # Now remove invalid characters from the file name - for invalid chars see https://en.wikipedia.org/wiki/Filename#Reserved%5Fcharacters%5Fand%5Fwords 
    file_name = re.sub(ur'(\?|\\|\?|\%|\*|:\||"|<|>)',ur'',''.join(doc_title)) 
    with codecs.open(os.path.join(spath, "%s.txt"%file_name), "w", encoding ='utf-8') as href_doc: 
     href_doc.write(link_pg.text) 

Я просто использовал regex удалить недействительные имя файла символов, вы можете использовать replace FUNCTION- для деталей регулярного выражения я использовал просачивания LIVE DEMO

+0

Прохладный, я получил его работу! Благодаря! Я просто искал все, что вы добавили, и мне любопытно, что в python 3 и выше кодеки устарели? Кажется, что в py3 open есть те же возможности. – JJ47

+1

@ JJ47- Yap! 'codecs.open()' является несуществующим в 3.x – SIslam

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