我的总体目标是拥有一个不会在网站url刮擦期间被刮擦的url数组/列表,如下面的代码示例所示
('scrapy.py')的逻辑:
在('source')中打开url〜>从('source')中的url中找到'a'标签〜>在'a'标记中找到'href'〜>如果'href'的值不等于( !=)('done')在文件('doneurls.py')〜>中,然后将不等于('done')的url写入文件('url.py')
我正在使用的代码是'scrapy.py':
from bs4 import BeautifulSoup
import requests
import csv
import os
import sys
from os.path import dirname, join, abspath
sys.path.insert(0, abspath(join(dirname(__file__), '..')))
from doneurls import done
source = requests.get('http://localhost/index.php').text
soup = BeautifulSoup(source, 'lxml')
file = open('./url.py', 'a')
csv_writer = csv.writer(file)
from html.parser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self,tag,attrs):
# Only parse the 'anchor' tag.
if tag == "a":
# Check the list of defined attributes.
for name, value in attrs:
# If href is defined, print it.
if name == "href":
if value != done:
csv_writer.writerow('b="'+value+'"')
parser = MyHTMLParser()
parser.feed(source)
file.close()
index.php:
<a href="http://localhost/next.php">hello</a>
<a href="http://localhost/next3.php">hello</a>
<a href="http://localhost/next2.php">hello</a>
<a href="http://localhost/next1.php">hello</a>
<a href="http://localhost/1.php">hello</a>
<a href="http://localhost/2.php">hello</a>
<a href="http://localhost/3.php">hello</a>
doneurls.py:
done = "http://localhost/2.php"
这段代码似乎可以正常工作,并且它只忽略了我添加到doneurls.py的一个URL,并且效果很好,但是我想要做的就是像这样添加一个URL数组
done = {
"http://localhost/2.php",
"http://localhost/next1.php",
"http://localhost/next2.php"}
当我尝试将'done'作为数组运行时,根本不会跳过任何url。我正在使用此代码来尝试不必刮擦过去刮过的网址。
答案 0 :(得分:1)
如果我对问题的理解很好,您可以尝试使用以下方法查看找到的每个URL:
if value != done:
问题在于,以上内容仅允许检查一个done
网址,而不是可能已经检查过的多个网址。因此,如果done
成为列表,则可以使用运算符in
(这里将需要not in
,因为我们要检查它是否不存在):
if value not in done:
请注意,Python中的列表是使用方括号创建的,因此done
应该类似于以下内容:
done = [
"http://localhost/2.php",
"http://localhost/next1.php",
"http://localhost/next2.php"
]
括号用于set和dictionaries,尽管在此处设置done
并没有太大关系。