【问题标题】:Extract all links from a web page using python使用python从网页中提取所有链接
【发布时间】:2016-01-05 11:04:57
【问题描述】:

在 Udacity 的计算机科学入门课程之后,我正在尝试制作一个 python 脚本来从页面中提取链接,下面是我使用的代码:

我收到以下错误

NameError:名称“页面”未定义

代码如下:

def get_page(page):
    try:
        import urllib
        return urllib.urlopen(url).read()
    except:
        return ''

start_link = page.find('<a href=')
start_quote = page.find('"', start_link)
end_quote = page.find('"', start_quote + 1)
url = page[start_quote + 1:end_quote]

def get_next_target(page):
    start_link = page.find('<a href=')
    if start_link == -1:
        return (None, 0)
    start_quote = page.find('"', start_link)
    end_quote = page.find('"', start_quote + 1)
    url = page[start_quote + 1:end_quote]
    return (url, end_quote)

(url, end_pos) = get_next_target(page)

page = page[end_pos:]

def print_all_links(page):
    while True:
        (url, end_pos) = get_next_target(page)
        if url:
            print(url)
            page = page[:end_pos]
        else:
            break

print_all_links(get_page("http://xkcd.com/"))

【问题讨论】:

  • 好吧,你在定义get_page之后使用page
  • 当我定义 page="content" 时,结果为零
  • 我会像这样使用seleniumbrowser.find_elements_by_tag_name('a')
  • 您期待page 神奇地来自哪里,究竟是什么?还是url
  • 从第 8 行开始使用变量 page,但它在哪里定义?

标签: python


【解决方案1】:

page 未定义,这是导致错误的原因。

对于这样的网络抓取,您可以简单地使用beautifulSoup

from bs4 import BeautifulSoup, SoupStrainer
import requests

url = "http://stackoverflow.com/"

page = requests.get(url)    
data = page.text
soup = BeautifulSoup(data)

for link in soup.find_all('a'):
    print(link.get('href'))

【讨论】:

    【解决方案2】:

    您可以在htmlpage 中找到所有具有包含http 属性的标签实例。这可以使用来自BeautifulSoupfind_all 方法并传递attrs={'href': re.compile("http")} 来实现

    import re
    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(htmlpage, 'html.parser')
    links = []
    for link in soup.find_all(attrs={'href': re.compile("http")}):
        links.append(link.get('href'))
    
    print(links)
    

    【讨论】:

    • 不是我的投票,但我删除了评论。我在低质量审核队列中遇到了这个问题。那里无法投票。
    【解决方案3】:

    我在这里有点晚了,但这是从给定页面上获取链接的一种方法:

    from html.parser import HTMLParser
    import urllib.request
    
    
    class LinkScrape(HTMLParser):
    
        def handle_starttag(self, tag, attrs):
            if tag == 'a':
                for attr in attrs:
                    if attr[0] == 'href':
                        link = attr[1]
                        if link.find('http') >= 0:
                            print('- ' + link)
    
    
    if __name__ == '__main__':
        url = input('Enter URL > ')
        request_object = urllib.request.Request(url)
        page_object = urllib.request.urlopen(request_object)
        link_parser = LinkScrape()
        link_parser.feed(page_object.read().decode('utf-8'))
    

    【讨论】:

    • 亲爱的 Mana - 非常感谢您的解释 - 这非常有帮助。
    猜你喜欢
    • 2014-01-30
    • 2019-04-12
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2018-03-26
    相关资源
    最近更新 更多