Как сделать веб-краулер, который анализирует ссылки с названием «заплатка» или «исправить»?

Я пытаюсь запрограммировать прикладную задачу проекта Debian GSoC, и мне удалось проанализировать текстовый файл, загруженный из Интернета, но мне было трудно загрузить исправления по ссылке на странице. очистив страницу, особенно первую появившуюся страницу: сайт BugZilla с sourceware.org.

Вот код, который я пробовал:

#!/usr/bin/env python3 This program uses Python 3, don't use with 2.
import requests
from bs4 import BeautifulSoup
import re
import os


PAGES_CAH = ["https://sourceware.org/bugzilla/show_bug.cgi?id=23685", "https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f055032e4e922f1e1a5e11026c7c2669fa2a7d19", "https://github.com/golang/net/commit/4b62a64f59f73840b9ab79204c94fee61cd1ba2c", "http://www.ca.tcpdump.org/cve/0002-test-case-files-for-CVE-2015-2153-2154-2155.patch" ]
patches = []


def searchy(pages):
    for link in pages:
        global patches
        if "github.com" in link and "commit" in link: # detect that in each page that it's from GitHub
            if 'patch' not in link: # detect if it's a patch page or not
                link = link + '.patch' # add .patch to link if the patch link lacks it
            request = requests.get(link) # connect to page
            patches.append(request.text) # download patch to patches variable
        elif ".patch" in link: # any other page with ".patach" in the end is downloaded like GitHub patches by default
            request = requests.get(link) # connect to page
            patches.append(request) #downmload patch to patches variable
        else:
            request = requests.get(link) # connect to page
            soup = BeautifulSoup(request.text, "lxml") # turn the page into something parsable
            if "sourceware.org/git" in link: # if it's from sourceware.org's git:
                patch_link = soup.find_all('a', string = "patch") # find all patch links
                patch_request = requests.get(patch_link[0]) # connect to patch link
                patches.append(patch_request.text) # download patch
            elif "sourceware.org/bugzilla" in link: # if it's from sourceware's bugzilla
                patch_link_possibilities = soup.find('a', id = "attachment_table") # find all links from the attachment table
                local_patches_links = patch_link_possibilities.find_all(string = "patch") # find all links with the "patch" name
                local_fixes_links = patch_link_possibilities.find_all(string = "fix") # find all links with the "fix" name
                for lolpatch in local_patches_links: # for each local patch in the local patch links list
                    patch_request = requests.get(lolpatch) # connect to page
                    patches.append(patch_request.text) #download patch
                for fix in local_fixes_links: # for each fix in the local fix links list
                    patch_request = requests.get(fix) # connect to page
                    patches.append(patch_request.text) #download patch
searchy(PAGES_CAH)
print(patches)

попробуй string=re.compile(".*patch")

furas 07.04.2019 02:24

Я попробую, но что именно это делает?

RoundDuckMan 07.04.2019 05:32

он использует регулярное выражение для поиска всех строк/текстов, которые заканчиваются словом «патч».

furas 07.04.2019 11:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать добавить селектор псевдокласса :contains для поиска patch в тексте ссылки. Требуется BeautifulSoup 4.7.1

import requests
from bs4 import BeautifulSoup
url = 'https://sourceware.org/bugzilla/show_bug.cgi?id=23685'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'lxml')

links = [item['href'] for item in soup.select('a:contains(patch)')]
print(links)

Вы можете расширить синтаксис css или:

links = [item['href'] for item in soup.select('a:contains(patch), a:contains(fix)')]

Это выглядит хорошо, я посмотрю, сработает ли это для меня. Если это произойдет, я буду считать этот вопрос решенным.

RoundDuckMan 08.04.2019 00:26

Надеюсь, это будет, и вы увидите, как вы можете расширить.

QHarr 08.04.2019 15:56

Я воспользовался вашей идеей, она кажется довольно хорошей, но я просто получаю «attachment.cgi?id=blah», а не рядом с «bugzilla/». Я думаю, это нормально, и я все равно добавляю «sourceware.org/bugzilla» к этим значениям в списке? Спасибо за помощь.

RoundDuckMan 09.04.2019 02:39

ура, хаза!

QHarr 09.04.2019 07:43

Другие вопросы по теме