如何在Python中使用lxml从网页中查找所有(完整)子链接

如何在Python中使用lxml从网页中查找所有(完整)子链接,python,html,url,web-scraping,lxml,Python,Html,Url,Web Scraping,Lxml,下面的代码获取URL并返回指向原始URL页面上包含的页面的链接列表 import urllib import lxml.html def getSubLinks(url): sublinks = [] connection = urllib.urlopen(url) dom = lxml.html.fromstring(connection.read()) for link in dom.xpath('//a/@href'): sublinks.append(link) return

下面的代码获取URL并返回指向原始URL页面上包含的页面的链接列表

import urllib
import lxml.html

def getSubLinks(url):
sublinks = []
connection = urllib.urlopen(url)
dom = lxml.html.fromstring(connection.read())
for link in dom.xpath('//a/@href'):
    sublinks.append(link)
return sublinks
这似乎是可行的,除了,对于同一个域上的页面,它会从URL中删除该域,而这不是我想要的。我想找回完整的未更改链接。例如,在网页上使用此选项:

“”

返回列表(以及更多内容):


但是,如您所见,前面的“”已从“2015-16html/fixtures.html”和其他内容中删除,而我不希望发生这种情况,我希望“”。如何解决此问题?

您可以使用以下方法:

import urllib
import lxml.html

def getSubLinks(url):
    sublinks = []
    connection = urllib.urlopen(url)
    dom = lxml.html.fromstring(connection.read())
    for link in dom.xpath('//a/@href'):
        if not link.startswith('http'):
            sublinks.append(url+link)
        else:
            sublinks.append(link)
    return sublinks
调用函数时,请使用
getSubLinks('http://www.nufc.com/)
(请注意URL末尾的
/


这将在页面上的
a
标记的每个
href
属性上循环。对于每个链接,如果链接不是以“http”开头,它将附加
url+link
,即
http://www.nufc.com/“+链接
。这将生成您想要的结果集。

谢谢您的回答。我们如何确保所有非http起始链接都可以像这样简单地更改。“邮件收件人:example@example.com'? 将URL附加到这个页面的前面是没有意义的。此外,如果链接仅以“www”开头,该怎么办?然后我们将获得“…”。很公平,但你明白了!你只需要有创意,用额外的条件覆盖所有你想要的用例。如果不是link.startswith('http')、而不是link.startswith('www')、而不是link:中的“@”,则可以更改为
,但我主要关心的是这些情况有多少?有没有办法防止lxml首先剥离这些链接?这不是
lxml
的错
lxml
只是在显示时读取/解析HTML。这是由我们来破译绝对和相对的联系。我认为我们已经涵盖了所有的用例——一个简单的谷歌应该会显示更多的用例。或者,您可以对每个生成的链接ping一个
请求
,并查看状态代码(不建议您大量这样做…!)检查html显示这不是链接的原始格式,因此lxml必须更改它。
import urllib
import lxml.html

def getSubLinks(url):
    sublinks = []
    connection = urllib.urlopen(url)
    dom = lxml.html.fromstring(connection.read())
    for link in dom.xpath('//a/@href'):
        if not link.startswith('http'):
            sublinks.append(url+link)
        else:
            sublinks.append(link)
    return sublinks