Итак, меня интересует эта теорияо том, что если вы перейдете к случайной статье в Википедии, щелкнете по первой ссылке не внутри круглых скобок несколько раз, в 95% случаев случаев вы попадете на статью о Философии.
Я хотел написать скрипт на Python, который извлекает для меня ссылку и, в конце концов, выводит хороший список посещенных статей (linkA -> linkB -> linkC
) и т. д.
Мне удалось получить HTML DOM веб-страниц, и мне удалось удалить некоторые ненужные ссылки и верхнюю строку описания, которая ведет к страницам с неоднозначностью. На данный момент я пришел к следующему выводу:
где-то в качестве своего предка (чаще всего родительского или прародительского, если он находится внутри тега
или подобного ему. Верхняя панель который ведет на страницы с неоднозначностью, похоже, не содержит никаких элементов
.Википедия:
Пока, так Хорошо, но меня бесят скобки.Например, в статье о Человекепервая ссылка не в круглых скобках — «/wiki/Species», но скрипт находит «/wiki/Taxonomy», которая находится внутри них.
Я понятия не имею, как это сделать программно, так как мне приходится искать текст в некоторой комбинации родительских/дочерних узлов, которые могут не всегда совпадать. Любые идеи?
Мой код можно увидеть ниже, но это то, что я сделал очень быстро и не очень горжусь этим. Однако он прокомментирован, так что вы можете увидеть ход моих мыслей (надеюсь :)).
"""Wikipedia fun"""
import urllib2
from xml.dom.minidom import parseString
import time
def validWikiArticleLinkString(href):
""" Takes a string and returns True if it contains the substring
'/wiki/' in the beginning and does not contain any of the
"special" wiki pages.
"""
return (href.find("/wiki/") == 0
and href.find("(disambiguation)") == -1
and href.find("File:") == -1
and href.find("Wikipedia:") == -1
and href.find("Portal:") == -1
and href.find("Special:") == -1
and href.find("Help:") == -1
and href.find("Template_talk:") == -1
and href.find("Template:") == -1
and href.find("Talk:") == -1
and href.find("Category:") == -1
and href.find("Bibcode") == -1
and href.find("Main_Page") == -1)
if __name__ == "__main__":
visited = [] # a list of visited links. used to avoid getting into loops
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')] # need headers for the api
currentPage = "Human" # the page to start with
while True:
infile = opener.open('http://en.wikipedia.org/w/index.php?title=%s&printable=yes' % currentPage)
html = infile.read() # retrieve the contents of the wiki page we are at
htmlDOM = parseString(html) # get the DOM of the parsed HTML
aTags = htmlDOM.getElementsByTagName("a") # find all tags
for tag in aTags:
if "href" in tag.attributes.keys(): # see if we have the href attribute in the tag
href = tag.attributes["href"].value # get the value of the href attribute
if validWikiArticleLinkString(href): # if we have one of the link types we are looking for
# Now come the tricky parts. We want to look for links in the main content area only,
# and we want the first link not in parentheses.
# assume the link is valid.
invalid = False
# tables which appear to the right on the site appear first in the DOM, so we need to make sure
# we are not looking at a tag somewhere inside a