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)
А почему вы решили, что он должен выводить полные ссылки? Ссылки на страницах Википедии конечно же относительные (как это обычно и делается на сайтах), элементы со ссылками выглядят примерно так все:
<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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP