HTML 解析器 handle_starttag()
HTML Parser handle_starttag()
我正在尝试将所有绝对文件放入一个名为 https 的列表中。但是,当我 运行 我的代码并尝试 return https 时,它 return 是一个空列表。有人可以帮我吗?
def getWebInfo(url):
infile=urlopen(url)
content=infile.read().decode()
infile.close()
https=[]
def handle_starttag(tag, attrs):
if tag.lower() == 'a':
for attr in attrs:
if attr[0]=='href':
absolute=urljoin(url, attr[1])
if absolute[:7]=='http://':
https.append(absolute)
parser=HTMLParser()
parser.feed(content)
print('ALL ABSOLUTE LINKS ON THE WEB PAGE')
print('--------------------------------------')
return https
getWebInfo('https://python.readthedocs.io/en/v2.7.2/library/htmlparser.html')
return秒:
网页上的所有绝对链接
[]
我希望能够 运行 代码,这样当我输入任何 url 时,它 return 就是在该网页上找到的绝对链接。我真的不想使用 BeautifulSoup.. 谁能帮我
已编辑
我在我的代码中调用了 handle_starttag,现在我得到了这个错误:
如果 attr[0] == 'href':
类型错误:'HTTPResponse' 对象不支持索引
这里的问题是您永远不会修改 https
列表。您定义了 handle_starttag
函数——它附加到列表中——但是从不调用它。
HTMLParser class 并非设计为开箱即用。这个想法是您创建自己的 class 从 HTMLParser 继承并覆盖您要使用的方法。实际上,这意味着将 'handle_starttag' 函数添加到 class,如下所示:
class MyParser(HTMLParser): # <- new class is a subclass of HTMLParser
def handle_starttag(self, tag, attrs): # <- methods need a self argument
if tag.lower() == 'a':
for attr in attrs:
if attr[0]=='href':
absolute=urljoin(url, attr[1])
if absolute[:7]=='http://':
https.append(absolute)
但是 handle_starttag 有一个问题:现在它在 class 中,名称 https
和 url
没有定义。您可以在创建解析器后通过将它们设为解析器的属性来解决此问题,如下所示:
parser = MyParser()
parser.https = https
parser.url = url
并在 handle_starttags 方法中为它们添加前缀 self.
,以便 Python 解释器在您的解析器中查找这些属性。所以你的代码应该看起来像这样:
class MyParser(HTMLParser):
def handle_starttag(self, tag, attrs):
if tag.lower() == 'a':
for attr in attrs:
if attr[0]=='href':
absolute=urljoin(self.url, attr[1])
if absolute[:7]=='http://':
self.https.append(absolute)
def getWebInfo(url):
infile=urlopen(url)
content=infile.read().decode()
infile.close()
https=[]
parser=MyParser()
parser.https = https
parser.url = url
parser.feed(content)
print('ALL ABSOLUTE LINKS ON THE WEB PAGE')
print('--------------------------------------')
return https
links = getWebInfo('https://python.readthedocs.io/en/v2.7.2/library/htmlparser.html')
for link in links:
print(link)
我正在尝试将所有绝对文件放入一个名为 https 的列表中。但是,当我 运行 我的代码并尝试 return https 时,它 return 是一个空列表。有人可以帮我吗?
def getWebInfo(url):
infile=urlopen(url)
content=infile.read().decode()
infile.close()
https=[]
def handle_starttag(tag, attrs):
if tag.lower() == 'a':
for attr in attrs:
if attr[0]=='href':
absolute=urljoin(url, attr[1])
if absolute[:7]=='http://':
https.append(absolute)
parser=HTMLParser()
parser.feed(content)
print('ALL ABSOLUTE LINKS ON THE WEB PAGE')
print('--------------------------------------')
return https
getWebInfo('https://python.readthedocs.io/en/v2.7.2/library/htmlparser.html')
return秒:
网页上的所有绝对链接
[]
我希望能够 运行 代码,这样当我输入任何 url 时,它 return 就是在该网页上找到的绝对链接。我真的不想使用 BeautifulSoup.. 谁能帮我
已编辑
我在我的代码中调用了 handle_starttag,现在我得到了这个错误:
如果 attr[0] == 'href':
类型错误:'HTTPResponse' 对象不支持索引
这里的问题是您永远不会修改 https
列表。您定义了 handle_starttag
函数——它附加到列表中——但是从不调用它。
HTMLParser class 并非设计为开箱即用。这个想法是您创建自己的 class 从 HTMLParser 继承并覆盖您要使用的方法。实际上,这意味着将 'handle_starttag' 函数添加到 class,如下所示:
class MyParser(HTMLParser): # <- new class is a subclass of HTMLParser
def handle_starttag(self, tag, attrs): # <- methods need a self argument
if tag.lower() == 'a':
for attr in attrs:
if attr[0]=='href':
absolute=urljoin(url, attr[1])
if absolute[:7]=='http://':
https.append(absolute)
但是 handle_starttag 有一个问题:现在它在 class 中,名称 https
和 url
没有定义。您可以在创建解析器后通过将它们设为解析器的属性来解决此问题,如下所示:
parser = MyParser()
parser.https = https
parser.url = url
并在 handle_starttags 方法中为它们添加前缀 self.
,以便 Python 解释器在您的解析器中查找这些属性。所以你的代码应该看起来像这样:
class MyParser(HTMLParser):
def handle_starttag(self, tag, attrs):
if tag.lower() == 'a':
for attr in attrs:
if attr[0]=='href':
absolute=urljoin(self.url, attr[1])
if absolute[:7]=='http://':
self.https.append(absolute)
def getWebInfo(url):
infile=urlopen(url)
content=infile.read().decode()
infile.close()
https=[]
parser=MyParser()
parser.https = https
parser.url = url
parser.feed(content)
print('ALL ABSOLUTE LINKS ON THE WEB PAGE')
print('--------------------------------------')
return https
links = getWebInfo('https://python.readthedocs.io/en/v2.7.2/library/htmlparser.html')
for link in links:
print(link)