[Tutor] Passing a config file to Python
Dave Angel
davea at davea.name
Thu Mar 14 23:51:06 CET 2013
On 03/14/2013 02:22 PM, Irina I wrote:
> Hi all,
>
> I'm new to Python and am trying to pass a config file to my Python script. The config file is so simple and has only two URLs.
>
> The code should takes that configuration file as input and generates a single file in HTML format as output.
>
> The program must retrieve each web page in the list and extract all the <a> tag links from each page. It is only necessary to extract the <a> tag links from the landing page of the URLs that you have placed in your configuration file.
>
> The program will output an HTML file containing a list of clickable links from the source webpages and will be grouped by webpage. This is what I came up with so far, can someone please tell me if it's good?
>
> Thanks in advance.
>
> [CODE]
>
> - - - - - - - - config.txt - - - - - - - -
> http://www.blahblah.bla
> http://www.etcetc.etc
> - - - - - - - - - - - - - - - - - - - - - -
>
> - - - - - - - - linkscraper.py - - - - - - - -
> import urllib
>
> def get_seed_links():
> ...."""return dict with seed links, from the config file, as keys -- {seed_link: None, ... }"""
> ....with open("config.txt", "r") as f:
> ........seed_links = f.read().split('\n')
readline() is much clearer and accomplishes what you want. Of course
then you'd have to move the newline from each line. But generally when
you're reading in manually entered data, you want to do a strip() on
each line anyway.
> ....return dict([(s_link, None) for s_link in seed_links])
>
> def get_all_links(seed_link):
> ...."""return list of links from seed_link page"""
> ....all_links = []
> ....source_page = urllib.urlopen(seed_link).read()
> ....start = 0
> ....while True:
> ........start = source_page.find("<a", start)
> ........if start == -1:
> ............return all_links
> ........start = source_page.find("href=", start)
> ........start = source_page.find("=", start) + 1
> ........end = source_page.find(" ", start)
> ........link = source_page[start:end]
> ........all_links.append(link)
>
> def build_output_file(data):
> ...."""build and save output file from data. data -- {seed_link:[link, ...], ...}"""
> ....result = ""
> ....for seed_link in data:
> ........result += "<h2>%s</h2>\n<break />" % seed_link
Perhaps by 'break' you really meant 'b' ??
> ........for link in data[seed_link]:
> ............result += '<a href="%s">%s</a>\n' % (link, link.replace("http://", ""))
> ........result += "<html /><html />"
You have no DOCTYPE header in your output file. The html tag pair need
to surround the bulk of the file, not consist of a one-space content.
You have no header and body section.
> ....with open("result.htm", "w") as f:
> ........f.write(result)
>
> def main():
> ....seed_link_data = get_seed_links()
> ....for seed_link in seed_link_data:
> ........seed_link_data[seed_link] = get_all_links(seed_link)
> ....build_output_file(seed_link_data)
>
> if __name__ == "__main__":
> ....main()
>
> [/CODE]
>
You never specify which version of Python this is written for, nor what
constraints there are on either the input html or output html. Some
comments are omitted, since they're version dependent.
Generally, your code is fragile as to what actual web pages would
actually work. Few websites actually try very hard to have valid html,
and even much valid html could break your current assumptions. Consider
Beautiful Soup instead of urllib or urllib2.
Your source code would have to be carefully edited to change all those
leading periods into spaces before it could even compile in Python.
That stops any of us from actually trying it, or pieces of it. So we
can only comment by inspection.
--
DaveA
More information about the Tutor
mailing list