在python3中从页面中提取链接

2024-04-29 12:43:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我想提取一个页面中的所有链接,这是我的代码,但它什么都不做,当我打印抓取的页面时,我打印得很好,但对于解析它没有任何作用!!在

from html.parser import HTMLParser
import urllib
import urllib.request


class myParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        if (tag == "a"):
            for a in attrs:
                if (a[0] == "href"):
                    link = a[1]
                    if (link.find('http') >= 1):
                        print(link)
                        newParser = myParser()
                        newParser.feed(link)

url = "http://www.asriran.com"
req = urllib.request.Request(url)
response = urllib.request.urlopen(req)
handle = response.read()
parser = myParser()
print (handle)
parser.feed(str(handle))

Tags: importhttpparsermyparserifrequesttaglink
1条回答
网友
1楼 · 发布于 2024-04-29 12:43:07

由于以下两个原因,您的代码不打印任何内容:

  • 不解码http响应,而是尝试解析字节而不是字符串
  • link.find('http') >= 1对于以httphttps开头的链接永远不会为真。您应该改为使用link.find('http') == 0link.startswith('http')

如果您想坚持使用HTMLParser,可以按如下方式修改代码:

from html.parser import HTMLParser
import urllib.request


class myParser(HTMLParser):

    links = []

    def handle_starttag(self, tag, attrs):
        if tag =='a':
            for attr in attrs:
                if attr[0]=='href' and str(attr[1]).startswith('http'):
                    print(attr[1])
                    self.links.append(attr[1])


with urllib.request.urlopen("http://www.asriran.com") as response:
    handle = response.read().decode('utf-8')
parser = myParser()
parser.feed(handle)

http_links = myParser.links

否则,我建议切换到Beautiful Soup并像这样解析响应:

^{pr2}$

相关问题 更多 >