Как не поцарапать один и тот же URL дважды? - PullRequest
0 голосов
/ 17 сентября 2018

Моя основная задача - получить массив / список URL, которые не будут очищены во время URL веб-сайта. Очистите логику, как показано в примере кода ниже:

логика для ('scrapy.py'):

открытый URL в ('source') ~> найти теги 'a' из url in ('source') ~> найти 'href' в тегах 'a' ~>, если значение 'href' не равно ( ! =) ('done') в файле ('doneurls.py') ~> затем записать URL-адреса, которые не равны ('done'), в файл ('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"

Этот код, кажется, работает, и он игнорирует только один URL-адрес, который я добавляю в doneurls.py, и работает хорошо, но я хочу добавить массив URL-адресов, чтобы сделать вот так

done = {
"http://localhost/2.php",
"http://localhost/next1.php",
"http://localhost/next2.php"}

Когда я пытаюсь запустить 'done' как массив, URL-адреса вообще не пропускаются. Я использую этот код, чтобы попытаться не перескакивать URL-адреса, которые я перебрал в прошлом.

1 Ответ

0 голосов
/ 17 октября 2018

Если я хорошо понимаю проблему, вы пытаетесь увидеть, был ли каждый найденный URL уже выполнен или нет, используя:

if value != done:

За исключением того, что вышеизложенное разрешает проверку только для одногоdone url вместо потенциально нескольких уже выполненных URL.Итак, если 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 s и словари , хотя создание done набора здесь не имеет большого значения.

...