python

时间:2017-09-16 14:44:03

标签: python http url syntax-error

我必须在python中创建一个函数,它搜索HTML页面中的链接,然后搜索每个链接,检查链接是否损坏。

首先,我创建了一个搜索每个链接(破坏与否)的功能,没问题,并将它们存储在名为" g"的数组中。

其次,我想创建一个阵列" a"它通过检查数组中的每个项目/元素来仅包含断开的链接" g"。

我不知道为什么,链接检查链接在该功能中不起作用。但是,如果我复制一个链接并将其粘贴为shell中的函数参数,则可以正常工作。

import urllib.request
import re
import urllib.error

def check(url):
    try:
        f= urllib.request.urlopen(url)
    except urllib.error.HTTPError :
            return False
    return True
def trouveurdurls(url):
    f= urllib.request.urlopen(url)
    b=(f.read().decode('utf-8'))
    d=re.findall('<a href=".*</a>',b)
    liste=[]
    f.close()
    for el in d:
        g=re.findall('"https?://.*\.*"',el)
        liste.append(g)
    a=[]
    for el in liste:
        chaine= ''.join(map(str,el))
        url=chaine.replace('\'','')
        print(url)
        #check(url)


b=trouveurdurls("http://127.0.0.1/")

2 个答案:

答案 0 :(得分:0)

这是一个使用&#34;请求的版本。&#34;它会抓取网页的网址,然后检查每个网址的响应代码(200表示它有效,等等)。

import requests
from bs4 import BeautifulSoup

page = 'http://the.web.site'

r = requests.get(page)

data = r.text

soup = BeautifulSoup(data, 'lxml')

urls = []

for a in soup.find_all('a'):
    urls.append(a.get('href'))

url_responses = {}

for url in urls:
    temp_r = requests.get(url)
    url_responses[url] = temp_r.status_code

答案 1 :(得分:0)

如果该行

,我会感到非常惊讶
['entities']

工作正常。星号正在进行贪婪的匹配,这意味着它找到了最长的匹配。如果您的文档中包含多个链接,则此正则表达式将吞噬最后一个链接的第一个和最后一个之间的所有内容。

您应该使用星号的非贪婪版本,例如*?

此外,您只对href属性感兴趣,所以

d=re.findall('<a href=".*</a>',b)

可能就是你想要的。这将使以下代码更容易;您不需要尝试查找以http://开头的网址,因为您已经在d = re.findall('<a href=".*?"', b) 数组中找到了网址。您的代码也会找到不属于某个href属性但只是普通文本的一部分或图像引用的一部分等的网址。

请注意,即使正则表达式d也不会经常产生匹配,因为HTML使用它的语法非常懒惰,因此您可能会遇到<a href=".*?",{{{{{{ 1}},<A HREF='.....'>等等。

您必须要么改进正则表达式以匹配所有这些情况,要么转向像Evan的答案那样的BeautifulSoup或者为您完成照顾的完整HTML解析器。