繁体   English   中英

在python中逐行从txt输入输入到变量

[英]feeding input to variable from txt line by line in python

我有一个变量DOMAIN,它以url作为输入。 我想从txt文件中一一填入URL列表。

我的txt文件如下所示:

www.yahoo.com
www.google.com
www.bing.com 

我正在这样做:

with open('list.txt') as f:
    content = f.readlines()
content = [x.strip() for x in content] 
DOMAIN = content

但是变量DOMAIN仅一次(而不是单独)获取所有URL。 它必须处理一个URL整体,然后处理另一个操作。

顺便提一句,此DOMAIN变量已供scrapy进行爬网。 代码库的一部分:

from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider
from scrapy.http import Request
with open('list.txt') as f:
    content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content] 
DOMAIN = content
URL = 'http://%s' % DOMAIN

class MySpider(BaseSpider):
    name = DOMAIN
    allowed_domains = [DOMAIN]
    start_urls = [
        URL
    ]

错误:

scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET http://['www.google.com', 'www.yahoo.com', 'www.bing.com']>
executing as scrapy runspider spider.py

单个网址的完整工作脚本-

from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider
from scrapy.http import Request

DOMAIN = 'google.com'
URL = 'http://%s' % DOMAIN

class MySpider(BaseSpider):
    name = DOMAIN
    allowed_domains = [DOMAIN]
    start_urls = [
        URL
    ]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        for url in hxs.select('//a/@href').extract():
            if not ( url.startswith('http://') or url.startswith('https://') ):
                url= URL + url 
            print url
            yield Request(url, callback=self.parse)

好的,因此您正在将要创建的域列表分配给DOMAIN。

content = DOMAIN

然后,您需要将“ http://”连接到以下每个地址:

with open('list.txt') as f:
    content = f.readlines()
content = [x.strip() for x in content]
domain_list = content
web = 'http://'
start_url = [web + s for s in domain_list]

然后,您将获得所有URL的列表,可用于连接。 我不确定在此之后您正在做什么,但是我认为它应该涉及遍历起始URL列表?

for url in start_url:
    scrapy.Request(url)  

希望这可以帮助,

这些行:

DOMAIN = content
URL = 'http://%s' % DOMAIN

您可以使DOMAIN指向刚从文件中创建的列表,然后将http://和该列表的字符串表示形式连接起来,这样您就可以得到:

`http://['www.google.com','www.yahoo.com', 'www.bing.com']'

因此,您的错误。 您需要将'http://'到列表的每个条目-您可以在读取文件时简单地做到这一点,方法是直接在列表理解中遍历文件,而不是使用readlines()

with open('list.txt','r') as f:
    url_list = ['http://'+line.strip() for line in f]

这将产生一个列表,然后您可以使用scrapy进行迭代:

['http://www.google.com','http://www.yahoo.com', 'http://www.bing.com']

请注意,如果它是一个很大的文件,则一次读入while文件可能被认为效率低下。 在这种情况下,您可以不需要将整个文件读入列表,而只需要在逐行处理文件时将请求读入:

with open('list.txt','r') as f:
    for line in f:
        url = 'http://'+line
        request = scrapy.http.Request(url)
        # Do something with request here

另外,请注意,不要将所有大写字母用作变量名,它们通常仅用于常量。 参阅PEP8-Python样式指南,以获取有关命名约定的更多指南。 当然,这些只是准则,而不是规则,但是如果您遵循这些准则,则以后其他人可以更轻松地遵循您的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM