Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从html中提取URL:修复截断_Url_Web Scraping_Beautifulsoup_Href - Fatal编程技术网

从html中提取URL:修复截断

从html中提取URL:修复截断,url,web-scraping,beautifulsoup,href,Url,Web Scraping,Beautifulsoup,Href,在浏览网站时,URL将被解析: for url in soup.find_all('a', class_='result-title hdrlnk'): print(url) 但提取的链接肯定有截断的格式,测试时它们有两种格式:完整的url,但没有“http:”或“http://”,域名丢失 如何: 分析url截断的类型 如何根据分析结果附加url的初始部分 您可以使用urljoin。在Python2中,它是urlparselib的一部分,在Python3中,它位于urlib.parse 此示

在浏览网站时,URL将被解析:

for url in soup.find_all('a', class_='result-title hdrlnk'):
print(url)
但提取的链接肯定有截断的格式,测试时它们有两种格式:完整的url,但没有“http:”或“http://”,域名丢失

如何:

  • 分析url截断的类型

  • 如何根据分析结果附加url的初始部分


  • 您可以使用
    urljoin
    。在Python2中,它是
    urlparse
    lib的一部分,在Python3中,它位于
    urlib.parse

    此示例适用于两个版本:

    try : 
        from urllib.parse import urljoin    # python 3.x #
    except ImportError : 
        from urlparse import urljoin    # python 2.x # 
    
    base_url = 'http://' + 'www.domain.com'    # scheme + netloc #  
    urls = [ url for url in soup.find_all('a', class_='result-title hdrlnk') ]
    full_urls = [ urljoin(base_url, url.get('href')) for url in urls ]
    
    urls_text = [ [ urljoin(base_url, url.get('href')), url.text ] for url in urls ]
    f = open("output1.html", "w") 
    f.write('\r\n'.join('<a href="{}">{}</a>'.format(*url) for url in urls_text))
    f.close()
    
    试试看:
    从urllib.parse导入urljoin#python 3.x#
    除恐怖外:
    从urlparse导入urljoin#python 2.x#
    基本url='http://'+'www.domain.com'#scheme+netloc#
    url=[soup.find_all('a',class='result-title hdrlnk')中url的url]
    完整url=[urljoin(基本url,url.get('href')表示url中的url]
    url_text=[[urljoin(base_url,url.get('href')),url.text]表示url中的url]
    f=打开(“output1.html”,“w”)
    f、 写入('\r\n'.join('.format(*url)表示url\u text中的url))
    f、 关闭()
    
    t.m.adam对这个问题的回答很好,但是,我用了类似的方法

    base = 'http://example.com/'
    for url in soup.find_all('a', class_='result-title hdrlnk'):
        if url.startswith('http:'):
            pass
        else:
            new_var = 'http://'+url
            #or new_var = base+url
    

    urljoin是一种更好的方法,因此我建议这样做。这是一种非常容易出错的方法,例如:如果url是,它将添加等等。

    它起作用了。谢谢,非常感谢!有一件事:你认为你知道我如何在a href标签中提取文本吗?因此,它将以链接+文本的形式打印,当保存为HTML时,将显示为带有文本的超链接?什么是netloc?netloc代表网络位置(域)。如果你想要href和text,我认为你应该使用嵌套列表。我更新了我的帖子,检查最后几行。我如何将其保存到文件中?用open(“output1.html”,“w”)作为file:file.write(str(full_url))file.close()?如果我的html文件中需要超链接文本,而不是纯文本,该怎么办?感谢不要使用
    str
    将列表转换为字符串,您将得到一堆括号。我更新了代码,试一试。谢谢你,Elvir,坦率地说,我没有使用你的方法,因为我是Python的新手,我只是非常小心地处理,Adam的方法对我很有效。我喜欢:它能用——不要碰它。我还负担不起如此自由和轻松)太棒了,这就是为什么我建议他的方法。这要好得多,但为了理解,我添加了一个答案。方法。StartWith用于检查字符串是否以其他字符串开头。