TransWikia.com

Как исправить код Python

Stack Overflow на русском Asked on November 27, 2021

Есть код из книги по Python он должен выводить ссылки со страницы но выводит только окончание ссылки, что с ним не так?

from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime
import random
import re

random.seed(datetime.datetime.now())


def getLinks(articleUrl):
    html = urlopen("http://en.wikipedia.org" + articleUrl)
    bsObj = BeautifulSoup(html, "html.parser")
    return bsObj.find
        ("div", {"id":"mw-content-text"}).findAll
        ("a",href=re.compile("^(/wiki/)((?!:).)*$"))
        
links = getLinks("/wiki/Kevin_Bacon")


while len(links) > 0:
    newArticle = links[random.randint(0, len(links) - 1)].attrs["href"]
    print(newArticle)
    links = getLinks(newArticle)

2 Answers

А почему вы решили, что он должен выводить полные ссылки? Ссылки на страницах Википедии конечно же относительные (как это обычно и делается на сайтах), элементы со ссылками выглядят примерно так все:

<a href="/wiki/National_day" title="National day">national day</a>

Скрипт получает эти относительные ссылки с сайта и выводит их как есть. Если хотите получать полные ссылки, вам нужно сделать полный URL из URL сайта Википедии и относительной части ссылки, как это и сделано в функции getLinks собственно:

html = urlopen("http://en.wikipedia.org" + articleUrl)

Answered by CrazyElf on November 27, 2021

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

from html.parser import HTMLParser
from urllib.request import urlopen
class MyHTMLParser(HTMLParser):
        def __init__(self, site_name, *args, **kwargs):
                self.links = []
                self.site_name = site_name
                super().__init__(*args, **kwargs)
                self.feed(self.read_site_content())
                self.write_to_file()
        def handle_starttag(self, tag, attrs):
                if tag == 'a':
                        for attr in attrs:
                                if attr[0] == 'href':
                                        if not self.validate(attr[0]):
                                                self.links.append(attr[1])
        def validate(self, link):
                return link in self.links or '#' in link or 'javascript:' in link
        def read_site_content(self):
                return str(urlopen(self.site_name).read())
        def write_to_file(self):
              f = open('links.txt', 'w')
              f.write('n'.join(sorted(self.links)))
              f.close()
input_link=input("Link:")
parser = MyHTMLParser(input_link)

P.S. Эта программа запишет все ссылки в файл - так мне кажется удобнее, но если Вам принципиально выводить в консоль, то просто замените

f = open('links.txt', 'w')
f.write('n'.join(sorted(self.links)))
f.close()

На

print('n'.join(sorted(self.links)))

Answered by Nezerix on November 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP