Питон и Красивый суп ||Regex с переменной перед записью в файл - PullRequest
0 голосов
/ 28 ноября 2018

Я хотел бы получить помощь или помощь по проблеме, которая у меня сейчас есть.Я работаю над небольшим Python-сканером в качестве проекта.В настоящее время импортируются следующие библиотеки:

requests
BeautifulSoup
re
tld

Точная проблема связана с «областью действия» сканера.Я хотел бы передать URL-адрес коду и попросить сканер захватить все теги привязки со страницы, но только те, которые относятся к базовому URL, игнорируя ссылки вне области действия, а также субдомены.

Здесьэто мой текущий код, я ни в коем случае не программист, поэтому прошу прощения за неаккуратный неэффективный код.

import requests
from bs4 import BeautifulSoup
import re
from tld import get_tld, get_fld

#This Grabs the URL
print("Please type in a URL:")
URL = input()

#This strips out everthing leaving only the TLD (Future scope function)
def strip_domain(URL):
    global domain_name
    domain_name = get_fld(URL)
strip_domain(URL)


#This makes the request, and cleans up the source code
def connection(URL):
        r = requests.get(URL)
        status = r.status_code
        sourcecode = r.text
        soup = BeautifulSoup(sourcecode,features="html.parser")
        cleanupcode = soup.prettify()

        #This Strips the Anchor tags and adds them to the links array
        links = []
        for link in soup.findAll('a', attrs={'href': re.compile("^http://")}):
              links.append(link.get('href'))

        #This writes our clean anchor tags to a file
        with open('source.txt', 'w') as f:            
                for item in links:
                    f.write("%s\n" % item)

connection(URL)

Точная проблема кода связана с разделом "for link in soup.find".Я пытался проанализировать массив для тегов привязки, которые содержат только базовый домен, который является глобальным var "domain_name", так что он записывает только соответствующие ссылки в исходный текстовый файл.

google.com accepted
google.com/file accepted
maps.google.com not written

Есликто-то может помочь мне или указать мне правильное направление, я был бы признателен.Я также думал, что можно было бы написать каждую ссылку на файл source.txt, а затем изменить его после удаления ссылок «вне области видимости», но на самом деле считал, что это выгоднее сделать без необходимости создания дополнительного кода.

Кроме того, я не самый сильный в регулярных выражениях, но вот кто-то, кто мне поможетЭто некоторый код регулярного выражения, чтобы поймать все варианты http, www, https

(^http:\/\/+|www.|https:\/\/)

К этому я собирался добавить

.*{}'.format(domain_name)

1 Ответ

0 голосов
/ 29 ноября 2018

Я приведу две разные ситуации.Потому что я не согласен с тем, что значение href составляет xxx.com.На самом деле вы получите три или четыре или более вида значений href, таких как /file, folder/file и т. Д. Таким образом, вы должны преобразовать относительный путь в абсолютный путь, иначе вы не сможете собрать все URL-адреса.

Regex: (\/{2}([w]+.)?)([a-z.]+)(?=\/?)

  1. (\/{2}([w]+.)?) Соответствующие неосновные части начинаются с //
  2. ([a-z.]+)(?=\/?) Совпадают со всеми указанными символами до тех пор, пока мы не получим /, мы не должныиспользовать .* (слишком много)

Мой код

import re

_input = "http://www.google.com/blabla"


all_part = re.findall(r"(\/{2}([w]+.)?)([a-z.]+)(?=\/?)",_input)[0]
_partA = all_part[2] # google.com
_partB = "".join(all_part[1:]) # www.google.com
print(_partA,_partB)

site = [
    "google.com",
    "google.com/file",
    "maps.google.com"
]
href = [
    "https://www.google.com",
    "https://www.google.com/file",
    "http://maps.google.com"
]
for ele in site:
    if re.findall("^{}/?".format(_partA),ele):
        print(ele)

for ele in href:
    if re.findall("{}/?".format(_partB),ele):
        print(ele)
...