在某封信之前使用美丽的汤找到链接

时间:2017-07-07 15:25:58

标签: python beautifulsoup urllib

我有一个BeautifulSoup问题,希望你可以帮助我。

目前,我的网站上有很多链接。链接指向包含链接的项目数据的页面。如果你想查看它,就是这个:http://ogle.astrouw.edu.pl/ogle4/ews/ews.html。我最终想要完成的是打印出标有“N”的数据的链接。一开始可能并不明显,但如果你仔细观察网站,一些数据在他们的Star No之后有'N',而其他数据则没有。之后,我使用该链接下载包含该数据所需信息的文件。该网站非常方便,因为下载URL只会从数据更改为数据,所以我只需要更改URL的一部分,您将在下面的代码中看到。

我目前已经完成了数据下载部分。但是,这就是你进来的地方。目前,我需要输入我想要的BLG活动的识别号码。 (在您查看下面的代码后,这将变得明显。)但是,随着时间的推移,网站会不断更新,并且必须手动搜索“N”事件会占用不必要的时间。我希望Python代码能够为我做到这一点。我对这个主题的最初想法是,我可以通过文本搜索所有N的BeautifulSoup,但是我遇到了一些关于完成它的问题。我觉得我对BeautifulSoup不够熟悉,无法完成我想要完成的任务。一些帮助将不胜感激。

我目前的代码如下。我已经提出了一系列以'N'标签为例的BLG事件。

#Retrieve .gz files from URLs

from urllib.request import urlopen
import urllib.request
from bs4 import BeautifulSoup

#Access website
URL = 'http://ogle.astrouw.edu.pl/ogle4/ews/ews.html'
soup = BeautifulSoup(urlopen(URL))

#Select the desired data numbers 
numbers = list(range(974,998)) 
x=0
for i in numbers:
    numbers[x] = str(i)
    x += 1
print(numbers)

#Get all links and put into list
allLinks = []
for link in soup.find_all('a'):
    list_links = link.get('href')
    allLinks.append(list_links)

#Remove None datatypes from link list
while None in allLinks:
    allLinks.remove(None)
#print(allLinks)

#Remove all links but links to data pages and gets rid of the '.html'
list_Bindices = [i for i, s in enumerate(allLinks) if 'b' in s]
print(list_Bindices)
bLinks = []
for x in list_Bindices:
    bLinks.append(allLinks[x])
bLinks = [s.replace('.html', '') for s in bLinks]
#print(bLinks)

#Create a list of indices for accessing those pages
list_Nindices = []
for x in numbers:
    list_Nindices.append([i for i, s in enumerate(bLinks) if x in s])
#print(type(list_Nindices))
#print(list_Nindices)

nindices_corrected = []
place = 0
while place < (len(list_Nindices)):
    a = list_Nindices[place]
    nindices_corrected.append(a[0])
    place = place + 1
#print(nindices_corrected)

#Get the page names (without the .html) from the indices
nLinks = []
for x in nindices_corrected:
    nLinks.append(bLinks[x])
#print(nLinks)

#Form the URLs for those pages
final_URLs = []
for x in nLinks:
    y = "ftp://ftp.astrouw.edu.pl/ogle/ogle4/ews/2017/"+ x + "/phot.dat"
    final_URLs.append(y)
#print(final_URLs)
#Retrieve the data from the URLs
z = 0
for x in final_URLs:
    name = nLinks[z] + ".dat"
    #print(name)
    urllib.request.urlretrieve(x, name)
    z += 1
#hrm = urllib.request.urlretrieve("ftp://ftp.astrouw.edu.pl/ogle/ogle4/ews/2017/blg-0974.tar.gz", "practice.gz")

这段代码花了我相当长的时间来编写,因为我不是专业的程序员,也不是BeautifulSoup或URL操作方面的专家。事实上,我使用MATLAB而不是Python。因此,我倾向于用MATLAB来思考,这转化为效率较低的Python代码。但是,效率我在这个问题中搜索的内容。我可以等待额外的五分钟让我的代码完成,如果这意味着我理解发生了什么并且可以完成我需要完成的任务。感谢您提供的任何帮助!我意识到这是一个相当多方面的问题。

1 个答案:

答案 0 :(得分:0)

这应该这样做:

from urllib.request import urlopen
import urllib.request
from bs4 import BeautifulSoup

#Access website
URL = 'http://ogle.astrouw.edu.pl/ogle4/ews/ews.html'
soup = BeautifulSoup(urlopen(URL), 'html5lib')

在这里,我使用html5lib来解析网址内容。

接下来,我们将查看表格,如果明星名称中包含'N',则会提取链接:

table = soup.find('table')

links = []
for tr in table.find_all('tr', {'class' : 'trow'}):
    td = tr.findChildren()
    if 'N' in td[4].text:
        links.append('http://ogle.astrouw.edu.pl/ogle4/ews/' + td[1].a['href'])


print(links)

输出:

['http://ogle.astrouw.edu.pl/ogle4/ews/blg-0974.html', 'http://ogle.astrouw.edu.pl/ogle4/ews/blg-0975.html', 'http://ogle.astrouw.edu.pl/ogle4/ews/blg-0976.html', 'http://ogle.astrouw.edu.pl/ogle4/ews/blg-0977.html', 'http://ogle.astrouw.edu.pl/ogle4/ews/blg-0978.html', 
...
]